首页 > 解决方案 > Elasticsearch:有没有办法按百万(或更多)用户 ID 过滤查询?

问题描述

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

现在我也有用户组 - 在这样的组中可以有 milion+ 用户。

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

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

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

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

标签: elasticsearchfilter

解决方案


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

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

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

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

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


推荐阅读