huangfox

冰冻三尺,非一日之寒!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

1、TooManyClause

我们在使用terms query、prefix query、fuzzy query、wildcard query、range query的时候,一不小心就会遇到TooManyClause异常。这个异常是提醒我们查询子句太多了(超过默认阈值1024),而上面这类查询最终都会解析成BooleanQuery。例如:prefix query前缀匹配t*,解析后会将字典中所有以t开头的term全部匹配出来,然后用OR连接构成一个BooleanQuery。这种情况下就很容易发生TooManyClause异常。

 

2、处理方案

ES默认设置一个查询语句最多1024个子句,主要是对内存和性能的保障,如果遇到这个异常我们应该如何处理?

2.1 从业务角度控制查询语句的“规模”

例如拼接大量的OR查询子句,从业务角度进行缩减。

2.2 用filter替换query

terms query -> terms filter

prefix query -> prefix filter

fuzzy query -> N/A

wildcard query -> N/A

range query -> range filter

2.3 使用filter没有相关性得分,如果有相关性排序的需求,就得修改ES的默认配置

indices.query.bool.max_clause_count: 5000

 

参考:

Setting the BooleanQuery maxClauseCount in ElasticSearch

 

posted on 2018-08-21 14:51  huangfox  阅读(602)  评论(0编辑  收藏  举报