【问题标题】:Elasticsearch: Is there a way how to filter the query by milion(or more) of user ids?Elasticsearch:有没有办法按百万(或更多)用户 ID 过滤查询?
【发布时间】:2021-08-08 19:42:54
【问题描述】:

假设我有一个 Elasticsearch 数据库索引,其中包含用户的记录/文档 - 每个文档都有 user_id 字段。

现在我也有用户组 - 在这样的组中可以有百万以上的用户。

我想根据某个组中具有 user_ids 的所有文档进行聚合查询。

有可能做这样的事情还是会遇到某种限制?

如果不可能,是否有可能拥有例如一个包含某个组的 user_ids 并对该索引进行某种交叉查询的索引? (类似于 SQL 的子查询WHERE column_name IN (SELECT STATEMENT)

  "query": {
        "bool": {
            "filter": [
                {
                    "terms": {
                        "user_id": ["userId1", ..., "userId10000000"]
                    }
                }
            ]
        }
    }

【问题讨论】:

  • 请分享您的文档示例或索引映射。
  • 您是否可以用一个或多个组 ID 标记每个文档?还是动态生成的组?
  • @JamesDaily 组是动态生成和维护的。

标签: elasticsearch filter


【解决方案1】:

关于术语查询 - 术语查询中允许的术语数量是有限制的,随着 ElasticSearch 的不同版本不断变化。这个Github link 指向一个讨论,其中明确提到具有大量术语的查询很慢。这就是现在存在限制的原因之一,这可能取决于您使用的版本,但对于当前版本,该值默认为65,536 terms。 您可以使用max-terms-count 在索引设置中更改它。

所以看来您很可能不得不将您的查询分成几块。使用Scroll API,它维护一个上下文,相当于来自其他数据库(如mongo)的游标。

关于过滤器查询 - 过滤器查询被缓存以获得更好的性能。阅读thisthis。在使用多个过滤器查询或单个大型过滤器查询时,您可能必须考虑到这一点。

我建议使用 Scroll API,并为您的案例找到合适的(最佳性能)批量大小。很少有其他有类似要求的用户也建议这样做。阅读 cmets here。链接中值得一提的是,如果您的 id 遵循特定范围,则使用范围查询。那肯定是一个较小的查询,您不会遇到查询中的术语限制问题。

正如您所提到的,如果这百万个术语来自另一个 ES 文档,您可以使用 terms lookup,但同样的限制与 max-terms-count 相同。

【讨论】:

  • 最后一部分肯定很有趣。您如何看待为此利用多索引搜索?还有更多批量查询的方法吗?
  • 我不确定我是否理解您将如何在此用例中使用多索引搜索。您的某些数据是否来自另一个索引,或者您会像那样重组您的数据吗?关于第二部分,我唯一一次需要批量查询时,我们使用了 Scroll API。为您找到合适的块大小可能需要一些时间。如果您的处理时间过长,搜索上下文可能会丢失。
  • 用户 ID 可能被分组到另一个索引/文档中。是的,这将是一个庞大的数据和大量的用户 ID。 (目标是过滤一组用户id的某些数据(组的成员可以随时间变化以及数据))
猜你喜欢
  • 2022-01-12
  • 2022-01-18
  • 2015-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-13
  • 2018-10-14
  • 2015-11-02
相关资源
最近更新 更多