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