2016-07-07 45 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参数每个碎片分析记录的数目,但是你不会有任何关于该记录将被纳入控制和记录将不被纳入的结果,所以这选项很可能不是你想要的。