弹性搜索中的大量问题

时间:2017-02-13 14:33:45

标签: elasticsearch

我需要获取包含超过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过滤器或过滤过滤器?

1 个答案:

答案 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