elasticsearch - 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"]
}
}
]
}
}
解决方案
关于术语查询- 术语查询中允许的术语数量是有限制的,随着 ElasticSearch 的不同版本不断变化。这个Github 链接指向一个讨论,其中明确提到具有大量术语的查询很慢。这就是现在存在限制的原因之一,这可能取决于您使用的版本,但对于当前版本,该值默认为65,536 terms
. 您可以使用max-terms-count在索引设置中更改它。
所以看起来你很可能不得不把你的查询分成几块。使用Scroll API,它维护一个上下文,相当于来自其他数据库(如 mongo)的游标。
关于过滤器查询- 过滤器查询被缓存以获得更好的性能。阅读这个和这个。在使用多个过滤器查询或单个巨大的过滤器查询时,您可能必须考虑到这一点。
我建议使用 Scroll API,并为您的案例找到合适的(最佳性能)批量大小。很少有其他有类似要求的用户也建议这样做。在这里阅读评论。链接中值得一提的是,如果您的 id 遵循特定范围,则使用范围查询。那肯定是一个较小的查询,您不会遇到查询中的术语限制问题。
正如您所提到的,如果这百万个术语来自另一个 ES 文档,您可以使用术语查找,但同样的限制与max-terms-count
.
推荐阅读
- c++11 - 带有 OfStream 的只读文件系统
- sql - 将 ASP.NET Core 应用程序发布到 Azure 不起作用
- pyspark - 如何找到pyspark数据框的大小
- python - 使用 Python 使用 oAuth2 的 Rest API 身份验证问题
- python - Discord 音乐机器人 NoneType' 对象没有属性 'play'
- java - java serversocket上的聊天室
- linux - 在经典蓝牙设备中注册 org.bluez.Battery1
- python - 增加子图之间的间距
- c - 如何在C中访问同名的局部变量和全局变量
- c++ - 交换操作错误:“const vector<...>”类型的绑定值以引用“vector<...>”类型删除“const”限定符