前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >记录:maxClauseCount is set to 1024

记录:maxClauseCount is set to 1024

原创
作者头像
HLee
修改2021-08-12 18:08:47
3.6K0
修改2021-08-12 18:08:47
举报
文章被收录于专栏:房东的猫

背景: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"
      }
    }
  ]
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
归档存储
腾讯云 COS 归档存储(COS Archive Storage)是腾讯云对象存储 COS 低成本、持久可靠的存储类型,为企业和个人开发者提供海量、非结构化数据的长时间备份能力。与本地备份相比,归档存储采用分布式云端存储架构,您无需关注硬件维护及容量扩展,当您需要数据时,可以通过 RESTful API 对存储的数据进行恢复并设置有效期来访问。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档