Elasticsearch过滤器与针对多个ID的字词查询

时间:2018-07-22 10:14:58

标签: elasticsearch elasticsearch-5

我有与某些product_id相关的文档索引。而且我想查找所有具有特定ID的文档(大约有10万个product_id,索引总数为1亿个。)

在这种情况下,过滤查询是否是最快,最好的选择?

"query": { 
    "bool": {
        "filter": {"terms": {"product_id": product_ids}
    }
}

还是最好对ID进行分块并仅使用术语查询或其他方式?

这个问题可能有点重复,但是我将非常感谢最佳实践建议(以及一些推理)。

2 个答案:

答案 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数据,所以您可能不希望这样做)

编辑:

您可以批量进行如下查询:

  1. 获取my_index / _search {   “查询”:{     “条款”:{       “ _id”:[“ 1”,“ 2”,“ 3”,....“ 10000”] //调整为最佳数组长度     }   } }

  2. 如果您的文档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。在所有情况下,我始终使用滚动。