记录:maxClauseCount is set to 1024

2021-08-12 18:08:47 浏览数 (1)

背景:boo查询中过多的拼接bool导致报 too_many_clauses: maxClauseCount is set to 1024

代码语言:javascript复制
"root_cause": [
      {
        "type": "too_many_clauses",
        "reason": "too_many_clauses: maxClauseCount is set to 1024"
      }
]

查询DSL语句:

代码语言:javascript复制
POST sphinx-diseasedoctor/_search
{
  "from": 0,
  "size": 10,
  "query": {
    "bool": {
      "must": [
        {
          "match_phrase": {
            "diseasename": {
              "query": "狼疮性肾炎",
              "slop": 0,
              "zero_terms_query": "NONE",
              "boost": 3
            }
          }
        }
      ],
      "adjust_pure_negative": true,
      "boost": 1
    }
  },
  "sort": [
    {
      "_score": {
        "order": "desc"
      }
    }
  ]
}

原因:报错原因是Search限制一个bool查询中最多只能有1024个值或子查询,当超过1024时,会抛出异常。

实际原因:diseasename字段使用的分词器使用了同义词,导致“狼疮性肾炎”,被识别成了“狼疮肾炎,狼疮性肾炎,系统性红斑狼疮性肾炎”,再经过分词器分词之后,会出现很多个term,导致查询bool超过限制。

解决办法:

代码语言:javascript复制
方案一:当超过1024时可以将一个bool查询拆成两个子bool查询,使用must关键字,使得两个子bool查询是与的关系
方案二:编辑elasticsearch.yml,添加如下配置
    index.query.bool.max_clause_count: 10240
    注意:必须在最前面添加一个空格,即和其他配置首字母对齐,不然es启动报错。
方案三:由于索引分词使用了同义词,可以将查询分词和索引分词分开,单独设置查询分词
{
  "from": 0,
  "size": 10,
  "query": {
    "bool": {
      "must": [
        {
          "match_phrase": {
            "diseasename": {
              "query": "狼疮性肾炎",
              "slop": 0,
              "analyzer": "query_ansj", 
              "zero_terms_query": "NONE",
              "boost": 3
            }
          }
        }
      ],
      "adjust_pure_negative": true,
      "boost": 1
    }
  },
  "sort": [
    {
      "_score": {
        "order": "desc"
      }
    }
  ]
}

0 人点赞