如何在ElasticSearch聚合中包含所有文档并避免sum_other_doc_count>0

b4lqfgs4  于 2022-12-03  发布在  ElasticSearch
关注(0)|答案(2)|浏览(186)

ES不是我工作主流,有一个行为我无法纠正。我有一个相当简单的聚合查询:

GET /my_index/_search
{
  "size": 0,
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "request_type": "some_type"
          }
        },
        {
          "match": {
            "carrier_name.keyword": "some_carrier"
          }
        }
      ]
    }
  },
  "aggs": {
    "by_date": {
      "terms": {
        "field": "date",
        "order": {
          "_term": "asc"
        }
      },
      "aggs": {
        "carrier_total": {
          "sum": {
            "field": "total_count"
          }
        }
      }
    }
  }
}

我对https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html的理解是,并不是所有文档都包含在聚合中。实际上,根据查询部分,我确实在结果中看到“sum_other_doc_count”:值大于零。
我的问题:是否有一种方法来构建搜索,以便包含所有文档?文档的数量相当小,通常在1k以下,
先谢谢你Reuven

093gszye

093gszye1#

根据该文件,
size默认为10
from + size不能大于index.max_result_window索引设置,默认值为10,000。
在您的情况下,文档相当小,接近1k,因此1k的结果可以很容易地检索。
可以设置size参数来定义应该从整个术语列表中返回多少个术语桶。默认情况下,协调搜索过程的节点将请求每个碎片提供其自己的最大大小术语桶,并且一旦所有碎片响应,它将把结果减少到最终列表,然后返回给客户端。
因此,需要请求在字段日期中包含前1000个文档。
...

"by_date": {
  "terms": {
    "field": "date",
    "order": {
      "_term": "asc"
    },
    "size": 1000
  }
}

...

请求的大小越大,结果越准确,但计算最终结果的成本也越高

要了解更多信息,请参阅official doc

isr3a4wc

isr3a4wc2#

将terms agg的size从默认值10增加到一个稍大的数字:

...
    "by_date": {
      "terms": {
        "field": "date",
        "order": {
          "_term": "asc"
        },
        "size": 1000           <-----
      }
...

相关问题