为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Elasticsearch 中对术语聚合结果进行分页

如何在 Elasticsearch 中对术语聚合结果进行分页

HUX布斯 2023-08-08 16:45:57
我一直在尝试找出一种方法来对 Elasticsearch 中的术语聚合结果进行分页,但到目前为止我还无法达到预期的结果。这是我试图解决的问题。在我的索引中,我有一堆文档,它们的分数(与 ES _score 分开)是根据文档中其他字段的值计算的。每个文档“属于”一个客户,由customer_id字段引用。该文档还有一个 id,由doc_id字段引用,与 ES 元字段_id相同。这是一个例子。{ '_id': '1', 'doc_id': '1', 'doc_score': '85', 'customer_id': '123'}对于每个customer_id都有多个文档,所有文档都有不同的文档 id 和不同的分数。我想要做的是,给定客户 ID 列表,返回每个 customer_id 的顶级文档(每个客户仅 1 个),并能够通过常规 ES 搜索 API 中的方法对类似于size的结果进行分页。我想要用于文档分数的字段是doc_score字段。到目前为止,在我当前的Python脚本中,我尝试过使用具有“热门命中”聚合的嵌套 aggs 来仅获取每个客户的顶级文档。{ "size": 0, "query:": {  "bool": {   "must": [    {     "match_all": {}    },    {     "terms": {      "customer_id": customer_ids # a list of the customer ids I want documents for     }    },    {     "exists": {      "field": "score" # sometimes it's possible a document does not have a score     }    }   ]  } } "aggs": {  "customers": {   "terms" : {    {"field": "customer_id", "min_doc_count": 1},    "aggs": {     "top_documents": {      "top_hits": {       "sort": [        {"score": {"order": "desc"}}       ],       "size": 1      }     }    }   }  } }}然后,我通过遍历每个客户存储桶来“分页”,将顶部文档 blob 附加到列表中,然后根据分数字段的值对列表进行排序,最后获取切片documents_list[from:from+size]。问题是,假设我的列表中有 500 个客户,但我只想要第二个 20 个文档,即size = 20, from=20。因此,每次调用该函数时,我都必须首先获取 500 个客户中每个客户的列表,然后进行切片。这听起来效率很低,而且也是一个速度问题,因为我需要该函数尽可能快。理想情况下,我可以直接从 ES 获取第二个 20,而无需在函数中进行任何切片。我已经研究了 ES 提供的复合聚合,但在我看来,我无法在我的情况下使用它,因为我需要获取整个文档,即常规搜索 API 响应中 _source 字段中的所有内容。我将非常感谢任何建议。
查看完整描述

1 回答

?
大话西游666

TA贡献1817条经验 获得超14个赞

最好的方法是使用分区


根据文档:


GET /_search

{

   "size": 0,

   "aggs": {

      "expired_sessions": {

         "terms": {

            "field": "account_id",

            "include": {

               "partition": 1,

               "num_partitions": 25

            },

            "size": 20,

            "order": {

               "last_access": "asc"

            }

         },

         "aggs": {

            "last_access": {

               "max": {

                  "field": "access_date"

               }

            }

         }

      }

   }

}


查看完整回答
反对 回复 2023-08-08
  • 1 回答
  • 0 关注
  • 101 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信