一、TooManyClauseelasticsearch
咱們在使用terms query、prefix query、fuzzy query、wildcard query、range query的時候,一不當心就會遇到TooManyClause異常。這個異常是提醒咱們查詢子句太多了(超過默認閾值1024),而上面這類查詢最終都會解析成BooleanQuery。例如:prefix query前綴匹配t*,解析後會將字典中全部以t開頭的term所有匹配出來,而後用OR鏈接構成一個BooleanQuery。這種狀況下就很容易發生TooManyClause異常。性能
二、處理方案this
ES默認設置一個查詢語句最多1024個子句,主要是對內存和性能的保障,若是遇到這個異常咱們應該如何處理?排序
2.1 從業務角度控制查詢語句的「規模」內存
例如拼接大量的OR查詢子句,從業務角度進行縮減。get
2.2 用filter替換queryast
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
參考: