Elasticsearch 7.15使用terms查询8万+orderId时报search_phase_execution_exception错误
Elasticsearch 7.15 terms查询超8万值报错的解决办法
当你使用Elasticsearch 7.15执行terms查询,且orderId的取值数量超过80000时出现search_phase_execution_exception] all shards failed错误,本质是ES默认对terms查询的子句数量、请求大小有上限,同时大量值会给节点带来内存和性能压力。以下是可行的解决方式:
调整ES集群参数
ES默认的indices.query.bool.max_clause_count参数限制了布尔查询的最大子句数(默认1024),而terms查询会被拆解成多个子句执行,超过这个值就会报错。你可以动态调整这个参数:PUT /_cluster/settings { "persistent": { "indices.query.bool.max_clause_count": 100000 } }注意:参数值不要调得过高,否则可能导致节点内存占用飙升,要根据集群的硬件资源合理设置。
使用Terms Lookup查询
如果这些orderId已经存储在ES的另一个索引中,完全不用在请求里直接传几万条值,用terms lookup引用即可:GET /total_user_amount/_search { "query": { "terms": { "orderId": { "index": "存储orderId的索引名", "id": "存储orderId列表的文档ID", "path": "文档中存储orderId数组的字段名" } } }, "size": 0, "aggs": { "sum_amount": { "sum": { "field": "score" } } } }这种方式会让ES从指定索引的文档中读取orderId列表,大幅降低请求大小和内存消耗。
拆分批量查询
把8万条orderId拆分成多个小批次(比如每1万条一组),分别执行查询,最后自己在业务端汇总各个批次的聚合结果。这种方式不用修改ES配置,也能避免单次请求过载。替换查询方式
如果orderId的筛选有规律(比如属于某个时间范围、特定用户组),尽量用范围查询、bool组合查询等方式替代超大terms查询,从根源上避免这类问题。
内容的提问来源于stack exchange,提问作者mario
相关产品推荐
相关产品推荐

