2015-09-25 50 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