2015-09-25 64 views
0

我遇到了ElasticSearch的查询问题。 我们拥有的对象,看起来像这样:数组中的对象(标签)方面

{ 
    "id":"1234", 
    "tags":[ 
    { "tagName": "T1", "tagValue":"V1"}, 
    { "tagName": "T2", "tagValue":"V2"}, 
    { "tagName": "T3", "tagValue":"V3"} 
    ] 
} 

{ 
    "id":"5678", 
    "tags":[ 
    { "tagName": "T1", "tagValue":"X1"}, 
    { "tagName": "T2", "tagValue":"X2"} 
    ] 
} 

而且我想获得tagValues标记名= T1,这是“V1”和“X1”的列表。 我试图

{ 
    "filter": { 
    "bool": { 
     "must": [ 
     { 
      "term":{ 
      "tags.tagName": "T1" 
      } 
     } 
     ] 
    } 
    }, 
    "facets": { 
    "TagValues":{ 
     "filter": { 
     "term": { 
      "tags.tagName": "T1" 
     } 
     }, 
     "terms": { 
     "field": "tags.tagValue", 
     "size": 30 
     } 
    } 
    } 
} 

好像它返回所有tagValues所有标签 “T1”, “T2” 和 “T3”。

有人可以帮助我这个查询吗?我如何获得数组中的对象的分面列表?

任何帮助,将不胜感激。

谢谢

回答

1

主要思想是利用nested typetags领域。这里是映射你应该使用:

curl -XPUT localhost:9200/mytags -d '{ 
    "mappings": { 
    "mytag": { 
     "properties": { 
     "id": { 
      "type": "string" 
     }, 
     "tags": { 
      "type": "nested", 
      "properties": { 
      "tagName": { 
       "type": "string", 
       "index": "not_analyzed" 
      }, 
      "tagValue": { 
       "type": "string", 
       "index": "not_analyzed" 
      } 
      } 
     } 
     } 
    } 
    } 
}' 

然后你就可以重新索引数据并运行类似下面的查询,将第一只过滤包含文档tagName,其值是T1,然后使用aggregations(唐不再使用方面,因为它们已被弃用),您可以再次选择那些标记为tagNameT1,然后检索关联的tagValue字段的标记。这会得到预期的V1X1值。

curl -XPOST localhost:9200/mytags/mytag/_search -d '{ 
    "size": 0, 
    "query": { 
    "filtered": { 
     "filter": { 
     "nested": { 
      "path": "tags", 
      "query": { 
      "term": { 
       "tags.tagName": "T1" 
      } 
      } 
     } 
     } 
    } 
    }, 
    "aggs": { 
    "tags": { 
     "nested": { 
     "path": "tags" 
     }, 
     "aggs": { 
     "values": { 
      "filter": { 
      "term": { 
       "tags.tagName": "T1" 
      } 
      }, 
      "aggs": { 
      "values": { 
       "terms": { 
       "field": "tags.tagValue" 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
}' 
+0

这很好用!谢谢。 – ProgBear