【问题标题】:Navigating terms aggregation in Elastic with very large number of buckets在具有大量存储桶的 Elastic 中导航术语聚合
【发布时间】:2020-09-04 05:11:33
【问题描述】:

希望大家都平安!

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

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

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

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

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

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

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

但在 elasticsearch 中,不同的事物只能通过分桶(术语聚合)来处理。

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

任何帮助将不胜感激!

谢谢!

【问题讨论】:

    标签: elasticsearch aggregation


    【解决方案1】:

    分页聚合有 3 种方法。

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

    您已经尝试过的分区。

    Composite Aggregation:可以将多个数据源组合在一个桶中,并允许对其进行分页和排序。它只能使用 after_key 进行线性分页,即不能从第 1 页跳转到第 3 页。您可以获取“n”条记录,然后在 key 之后传递返回并获取下“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 个返回的术语桶

    所以这不适合你的情况

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

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

    【讨论】:

    • 使用这个我将不得不发出大约 700 个请求,每次请求 10k 文档才能检索所有内容。这是推荐的吗?文档还指定,“如果应该检索所有复合存储桶,最好使用小尺寸(例如 100 或 1000),然后使用 after 参数检索下一个结果。”这是为了 I/O 优化目的吗(我猜是的)在这种情况下,我最终可能会发出大约 7k 个搜索请求,每个请求 1k 个文档。
    • 感谢您的更新。显然,发出这么多搜索请求似乎并不可行,所以我想我将不得不从其他角度解决这个问题。
    • 我正在阅读其他一些答案,有人建议使用字段折叠功能。 elastic.co/guide/en/elasticsearch/reference/current/… 但我不确定它是如何工作的,因为在高基数字段上使用折叠让我不确定折叠的键 (primary_id) 是否会考虑索引中的每个文档。另外我不确定它是否适用于滚动请求
    • @NamanGupta Collapse 不适用于滚动。崩溃就像在字段上分组,但不幸的是 scrll 不支持它
    • 刚刚意识到,真可惜:(这正是我需要的。不知道现在该怎么办
    猜你喜欢
    • 2021-04-02
    • 1970-01-01
    • 2019-10-31
    • 2021-06-06
    • 2021-08-22
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多