在 Elastic 中使用大量存储桶导航术语聚合



希望大家平安!

我正在尝试探索在弹性搜索中处理以下用例的正确方法

假设我有大约 700000 个文档,我想根据一个字段进行存储(我们称之为 primary_id(。对于多个文档,此主 ID 可以相同(通常最多 2-3 个文档具有相同的primary_id(。在所有其他情况下,primary_id不会在任何其他文档中重复。

因此,平均每 10 个文档中,我将有 8 个唯一的主 ID,1 个文档之间的主 ID 相同

为了确保唯一性,我尝试使用术语聚合,最终我得到了存储桶来响应我的搜索请求,但没有用于后续的滚动请求。在谷歌搜索时,我发现滚动查询不支持聚合。

结果,我尝试寻找替代解决方案,并在此链接中尝试了解决方案,https://lukasmestan.com/learn-how-to-use-scroll-elasticsearch-aggregation/

它建议使用多个搜索请求,每个请求指定要获取的分区号(取决于您将结果划分为多少个分区(。但是即使客户端具有高超时设置,我也会收到客户端超时。

理想情况下,我想知道处理此类数据的最佳方法是什么,其中形成存储桶的字段的方差几乎等于文档的数量。SQL等效primary_id项将从.....

但是在 elasticsearch 中,不同的东西只能通过分桶(术语聚合(来处理。

我还使用热门歌曲作为术语聚合下的子聚合查询来获取_source字段。

任何帮助将不胜感激!

谢谢!

有 3 种方法可以对聚合进行分页。

  1. 复合聚合
  2. 分区
  3. 存储桶排序

您已经尝试过的分区。

复合聚合:可以将多个数据源合并到一个存储桶中,并允许对其进行分页和排序。它只能使用 after_key 线性分页,即您不能从第 1 页跳到第 3 页。你可以获取"n"条记录,然后在键之后传递返回的,并获取下一个"n"条记录。

GET index22/_search
{
"size": 0,
"aggs": {
"ValueCount": {
"value_count": {
"field": "id.keyword"
}
},
"pagination": {
"composite": {
"size": 2,
"sources": [
{
"TradeRef": {
"terms": {
"field": "id.keyword"
}
}
}
]
}
}
}
}

存储桶排序

与所有管道聚合一样,bucket_sort聚合是 在所有其他非管道聚合之后执行。这意味着 排序仅适用于已从 父聚合。例如,如果父聚合是术语 并且它的大小设置为 10,bucket_sort只会对那些进行排序 10 个返回的术语存储桶

所以这不适合您的情况

您可以通过更新设置索引.max_结果_窗口将结果大小增加到大于 10K 的值。设置太大的大小可能会导致内存不足问题,因此您需要对其进行测试,看看您的硬件可以支持多少。

更好的选择是使用滚动 API 并在客户端执行不同的操作

最新更新