当前位置: 首页 > news >正文

ES报错:解决too_many_clauses: maxClauseCount is set to 1024 报错问题

解决too_many_clauses: maxClauseCount is set to 1024 报错问题

    • 问题场景
    • 报错信息
    • 问题分析解决
      • 1. 优化查询
      • 2. 增加maxClauseCount
      • 3. 改用其他查询类型
      • 修改后的查询示例

问题场景

查询语句:查询clcNo分类号包含分类O的所有文档

{"match_phrase_prefix": {"clcNo": {"query": "O","analyzer": "standard","slop": 0,"max_expansions": 10000,"boost": 10.0}}
}

报错信息

{"took": 12,"responses": [{"error": {"root_cause": [{"type": "exception","reason": "Elasticsearch exception [type=search_phase_execution_exception, reason=all shards failed]","phase": "query","suppressed": [{"type": "exception","reason": "Elasticsearch exception [type=too_many_clauses, reason=too_many_clauses: maxClauseCount is set to 1024]"}]}],"type": "exception","reason": "Elasticsearch exception [type=search_phase_execution_exception, reason=all shards failed]","phase": "query","suppressed": [{"type": "exception","reason": "Elasticsearch exception [type=too_many_clauses, reason=too_many_clauses: maxClauseCount is set to 1024]"}]},"status": 500}]
}

问题分析解决

从报错信息来看,查询出现了too_many_clauses错误,这是因为使用的match_phrase_prefix或者in以及其他的查询生成的子句数量超过了Elasticsearch的默认限制(1024个子句)。我这里的错误是由于使用match_phrase_prefix可能扩展为大量词条的查询中超过了限制

可以尝试通过以下几种方式来解决这个问题:

  1. 优化查询:减少查询中使用的子句数量
  2. 增加maxClauseCount:增加Elasticsearch中允许的最大子句数量
  3. 改用其他查询类型:使用性能更好的查询类型

1. 优化查询

尝试减少子句数量,优化子句的查询数量,使得能减少到1024的个数限制

2. 增加maxClauseCount

如果确实需要大量的子句,可以增加Elasticsearch中的maxClauseCount限制。可以通过以下步骤来增加:

  • 修改Elasticsearch7.x配置文件 (elasticsearch.yml):

    indices.query.bool.max_clause_count: 2048
    
  • 或者通过Elasticsearch的API动态更新设置(这个我没尝试,而且可能只是临时的):

    curl -X PUT "localhost:9200/_settings" -H 'Content-Type: application/json' -d '{"index" : {"query" : {"bool" : {"max_clause_count" : 2048}}}
    }'
    

3. 改用其他查询类型

如果前两种方法不可行,考虑使用性能更好的查询类型,比如prefix查询。虽然prefix查询不如match_phrase_prefix查询精确,但它性能更好,并且不会产生过多的子句。

修改后的查询示例

这里是一个优化后的查询示例,将match_phrase_prefix替换为prefix查询,并减少inner_hits的数量:

  {"prefix": {"clcNo": {"value": "O","boost": 10.0}}}

以上修改包括:

  1. 使用prefix查询替代match_phrase_prefix查询。
  2. 降低inner_hits的数量,以减少子句数量。
http://www.lryc.cn/news/390456.html

相关文章:

  • 完全指南:在Linux上安装和精通Conda
  • # linux 系统中,使用 “ ll “ 命令报错 “ bash ll command not found “ 解决方法:
  • 吴恩达深度学习笔记:机器学习策略(2)(ML Strategy (2)) 2.3-2.4
  • 【软件测试】快速定位bug,编写测试用例
  • 升级springboot3
  • 视频编解码从H.264到H.266:浅析GB28181安防视频汇聚EasyCVR视频压缩技术
  • vue项目访问 域名/index.html 空页面问题
  • 区块链开发入门:基础概念与实施技术详解
  • Rust破界:前端革新与Vite重构的深度透视(下)
  • Android 解决 “Module was compiled with an incompatible version of Kotlin“ 问题
  • linux nfs的使用
  • eclipse断点调试(用图说话)
  • vue的学习--day2
  • html + css 快速实现订单详情的布局demo
  • 居然这么简单就能实现扫雷游戏!
  • 安装Gitlab+Jenkins
  • php 命令行模式详解
  • Git 基础-创建版本库 git init、添加到暂存区git add、查看状态git status、查看改动git diff
  • Python实现无头浏览器采集应用的反爬虫与反检测功能解析与应对策略
  • 法国工程师IMT联盟 密码学及其应用 2023年期末考试题
  • 魔行观察-AI数据分析-蜜雪冰城
  • 如何在CSS中设置px值
  • 【linux】find命令详解
  • Android音频管理器探索与应用
  • qt QTreeWidget文件管理器拖入应用,从应用拖入文件管理器拷贝
  • Qt中使用MySQL数据库详解,好用的模块类封装
  • C语言实现 人生重生模拟器游戏
  • C语言两个较大数字相加
  • 大数据面试题之Flume
  • js文件的执行和变量初始化缓存