2016-07-07 91 views
0

我正在運行彈性搜索查詢與聚合,我打算限制爲100條記錄。問題是,即使我應用「大小」過濾器,對聚合也沒有影響。彈性搜索限制彙總的記錄

GET /index_name/index_type/_search 
{ 
    "size":0, 
    "query":{ 
    "match_all": {} 
    }, 
    "aggregations":{ 
    "courier_code" : { 
     "terms" : { 
     "field" : "city" 
     } 
    } 
}} 

結果集是

{ 
    "took": 7, 
    "timed_out": false, 
    "_shards": { 
    "total": 10, 
    "successful": 10, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 10867, 
    "max_score": 0, 
    "hits": [] 
    }, 
    "aggregations": { 
    "city": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 0, 
     "buckets": [ 
     { 
      "key": "Mumbai", 
      "doc_count": 2706 
     }, 
     { 
      "key": "London", 
      "doc_count": 2700 
     }, 
     { 
      "key": "Patna", 
      "doc_count": 1800 
     }, 
     { 
      "key": "New York", 
      "doc_count": 1800 
     }, 
     { 
      "key": "Melbourne", 
      "doc_count": 900 
     } 
     ] 
    } 
    } 
} 

正如你可以看到有關於限制在其上聚集是要執行的記錄中沒有任何影響。 Elastic Search中有100個記錄是否有過濾器?

回答

1

elasticsearch中的搜索操作分兩個階段執行queryfetch。在第一階段,elasticsearch從所有分片中獲得結果,對它們進行分類並確定應該返回哪些記錄。這些記錄然後在第二階段被檢索。 size參數控制響應中返回給您的記錄數。在彈性搜索實際知道哪些記錄需要檢索並且它們始終在搜索中的所有記錄上執行之前,會在第一階段執行聚合。所以,不可能通過結果總數來限制它。如果您想限制聚合執行的範圍,則需要限制搜索查詢,而不是更改檢索參數。例如,如果您向搜索查詢添加一個過濾器,該過濾器僅包含去年的記錄,則聚合將在此過濾器上執行。

它也可以限制那些對使用terminate_after參數每個碎片分析記錄的數目,但是你不會有任何關於該記錄將被納入控制和記錄將不被納入的結果,所以這選項很可能不是你想要的。