我有与某些product_id相关的文档索引。而且我想查找所有具有特定ID的文档(大约有10万个product_id,索引总数为1亿个。)
在这种情况下,过滤查询是否是最快,最好的选择?
"query": {
"bool": {
"filter": {"terms": {"product_id": product_ids}
}
}
还是最好对ID进行分块并仅使用术语查询或其他方式?
这个问题可能有点重复,但是我将非常感谢最佳实践建议(以及一些推理)。
答案 0 :(得分:0)
对于非常大的结果集,可以使用弹性搜索查询的“ paging
”或“ scrolling
”功能。
使用“ from - to
”查询:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-from-size.html
或“ scroll
”查询:
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html
我认为“从/到”是一种更有效的方法,除非您希望每次返回数千个结果(可能会返回许多MB数据,所以您可能不希望这样做)
编辑:
您可以批量进行如下查询:
获取my_index / _search { “查询”:{ “条款”:{ “ _id”:[“ 1”,“ 2”,“ 3”,....“ 10000”] //调整为最佳数组长度 } } }
如果您的文档ID是连续的或您可以轻松订购的其他数字形式,并且具有可用字段,则可以执行“ range query
”
获取_search { “查询”:{ “范围” : { “ document_id_that_is_a_number”:{ “ gte”:0,//通过“ lte”步进因子在每个查询上进行颠簸 “ lte”:10000 //在此处找到一个合适的数字 } } } }
答案 1 :(得分:0)
经过一些测试和更多的阅读,我找到了答案:
过滤器查询与仅使用术语查询的块相比,工作速度要快得多。 但是制作真正的大型过滤器会大大减慢获得结果的速度。 在我的情况下,使用具有1万个id的块的过滤器查询要比使用所有10万个id的过滤器查询快10倍(顺便说一句,此数量已在Elasticsearch 6中受到限制)。
同样来自官方的Elasticsearch documentation: 术语过滤器中指定的ID数量可能很多。在这种情况下,可以使用术语过滤器的术语查找机制。
要考虑的唯一缺点是过滤器查询存储在缓存中。 (高速缓存实施LRU逐出策略:当高速缓存已满时,会将最近最少使用的数据逐出,以便为新数据让路。)
P.S。在所有情况下,我始终使用滚动。