我需要获取包含超过1024个列表中至少一个项目的所有文档。
我的查询基本上是 bool查询,其中应且 minimum_should_match:1 。
默认情况下,Elasticsearch maxClauseCount设置为1024。我试图将其设置为4096,配置看起来还可以:
我请求http://myserver:9200/my_index/_settings并获取:
...
"query": {
"bool": {
"max_clause_count": "4096"
}
}
...,
但是,如果我尝试在我的日志中仍然获得TooManyClauses[maxClauseCount is set to 1024]
。
第一个问题:为什么这是矛盾的?
我已经读过,在某些情况下,最好使用过滤器而不是大型bool:
一般情况下,我建议重写该查询以使用术语过滤器而不是布尔查询 https://discuss.elastic.co/t/too-many-clauses-maxclausecount-is-set-to-1024/61968
第二个问题:我如何使用过滤器来获取与我的示例中的多重应该相同的逻辑?对于那种情况,什么是最好的bool过滤器或过滤过滤器?
答案 0 :(得分:2)
我还不确定为什么Elasticsearch会引发maxClauseCount错误,但我找到了另一种构造查询的方法。
(简单)解决方案是使用包含大量项目的术语。如果我将其用于must
我会得到相同的错误,但使用filter
它会完美无缺。
示例:
{
"query": {
"bool": {
"filter": [
{"terms": {"my_field": ["item1", "item2", ... "itemN"]}}
]
}
}
}
唯一缺少filter
的是:
子句(查询)必须出现在匹配的文档中。然而,与必须不同的是,查询的分数将被忽略。 https://www.elastic.co/guide/en/elasticsearch/reference/2.3/query-dsl-bool-query.html