2016-09-28 124 views
0

計數我插入這個數據到彈性搜索:彈性搜索:聚集,通過場

[ 
    { "name": "Cassandra Irwin", "location": "Monzon de Campos" ..  }, 
    { "name": "Gayle Mooney",  "location": "Villarroya del Campo" .. }, 
    { "name": "Angelita Charles", "location": "Revenga de Campos" .. }, 
    { "name": "Sheppard Sweet", "location": "Santiago del Campo" .. }, 
    .. 
    .. 

旁註:重現: 1)下載:http://wmo.co/20160928_es_query/bulk.json 2)執行:捲曲-s -XPOST' http://localhost:9200/testing/external/_bulk?pretty'--data-binary @ bulk.json

問題:獲得每個「位置」有多少記錄的計數。

解決方案1:桶聚合..不給所期望的結果

curl -s -XPOST 'localhost:9200/testing/_search?pretty' -d ' 
{ 
    "aggs": { "location_count": { "terms": { "field":"location", "size":100 }}} 
}' | jq '.aggregations' 

結果:

{"location_count":{"doc_count_error_upper_bound":0,"sum_other_doc_count":0, 
"buckets":[ 
    {"key":"campo",  "doc_count":47}, 
    {"key":"del",  "doc_count":47}, 
    {"key":"campos", "doc_count":29}, 
    {"key":"de",  "doc_count":29}, 
    {"key":"villarroya","doc_count":15}, 
    {"key":"torre",  "doc_count":12}, 
    {"key":"monzon", "doc_count":11}, 
    {"key":"santiago", "doc_count":11}, 
    {"key":"pina",  "doc_count":9}, 
    {"key":"revenga", "doc_count":9}, 
    {"key":"uleila", "doc_count":9} 
]}} 

問題:它將該 '位置' 字段成單詞,並返回每個單詞的文檔數。

解決方案2:期望的結果,但性能方面的擔憂。

我可以使用此查詢,拿出所有的位置,並在做JQ聚集(在每一個方便的JSON CLI工具), 但是當應用到大量數據,這可以變成一個性能噩夢做到這一點:

curl -s -XPOST 'localhost:9200/testing/_search?pretty' -d ' 
{ 
    "query": { "wildcard": { "location": "*" } }, "size":1000, 
    "_source": ["location"] 
}' | jq '[.hits.hits[] | 
      {location:._source.location,"count":1}] | 
      group_by(.location) | 
      map({ key: .[0].location, value: map(.count)|add })' 

結果:

[ 
    { "key": "Monzon de Campos",  "value": 11 }, 
    { "key": "Pina de Campos",  "value": 9 }, 
    { "key": "Revenga de Campos",  "value": 9 }, 
    { "key": "Santiago del Campo", "value": 11 }, 
    { "key": "Torre del Campo",  "value": 12 }, 
    { "key": "Uleila del Campo",  "value": 9 }, 
    { "key": "Villarroya del Campo", "value": 15 } 
] 

這是我想確切的結果。

問題:如何通過彈性搜索查詢獲得相同的結果? (即與彈性搜索處理的聚集,而不是由JQ)

回答

1

你需要一個not_analyzed子字段添加到您的location領域。

首先修改您的映射是這樣的:

curl -XPOST 'http://localhost:9200/testing/_mapping/external' -d '{ 
    "properties": { 
     "location": { 
     "type": "string", 
     "fields": { 
      "raw": { 
       "type": "string", 
       "index": "not_analyzed" 
      } 
     } 
     } 
    } 
}' 

然後再重新索引數據:

curl -s -XPOST 'http://localhost:9200/testing/external/_bulk?pretty' --data-binary @bulk.json 

最後,你就可以(在location.raw場)運行這樣的查詢並獲得您期望的結果:

curl -s -XPOST 'localhost:9200/testing/_search?pretty' -d ' 
{ 
    "aggs": { "location_count": { "terms": { "field":"location.raw", "size":100 }}} 
}' | jq '.aggregations' 
+0

現貨! (我嘗試過這個)。 非常感謝您的快速和正確的答案! – WillemM

+0

真棒,很高興它幫助! – Val