降低index.max_result_window能否提升查询性能?为何修改后hits.total.value仍为10000?
关于Elasticsearch index.max_result_window的问题及解答
问题描述
1. 降低index.max_result_window能否提升查询性能?
尝试将该参数从10000调整为1000,执行命令如下:
curl -XPUT 'http://localhost:9200/company/_settings' -H 'Content-Type: application/json' -d' { "index" : { "max_result_window" : 1000 } }'
2. 调整参数后,查询返回的hits.total.value为何仍为10000?
返回结果片段:
"hits": { "total": { "value": 10000, "relation": "gte" },
补充信息
company索引映射
{ "company" : { "mappings" : { "properties" : { "comWeb" : { "type" : "keyword" }, "curyName" : { "type" : "keyword" }, "hldIds" : { "type" : "keyword" }, "hldNames" : { "type" : "text", "analyzer" : "ik_max_word", "search_analyzer" : "ik_smart" }, "id" : { "type" : "long" }, "induSmaPar" : { "type" : "keyword" }, "memberIds" : { "type" : "keyword" }, "memberNames" : { "type" : "text", "analyzer" : "ik_max_word", "search_analyzer" : "ik_smart" }, "name" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } }, "analyzer" : "ik_max_word", "search_analyzer" : "ik_smart" }, "offiAddr" : { "type" : "keyword" }, "operCond" : { "type" : "keyword" }, "orgAttrPar" : { "type" : "keyword" }, "orgChaStatus" : { "type" : "boolean" }, "orgClaName" : { "type" : "keyword" }, "orgDele" : { "type" : "keyword" }, "orgDeleCode" : { "type" : "long" }, "orgDeleParName" : { "type" : "keyword" }, "orgEstDate" : { "type" : "date" }, "orgMailAddr" : { "type" : "keyword" }, "orgStaPar" : { "type" : "keyword" }, "orgTel" : { "type" : "keyword" }, "province" : { "type" : "keyword" }, "regCap" : { "type" : "double" }, "shortName" : { "type" : "keyword" }, "viewCount" : { "type" : "integer" }, "weight" : { "type" : "byte" } } } }
查询语句
{ "query": { "function_score": { "query": { "bool": { "should": [{ "match": { "name": {"query":"{{query_name}}","minimum_should_match":"4<85%"} } }, { "match": { "shortName": { "query": "{{query_name}}", "boost": 2.9 } } }, { "term": { "name.keyword": { "value": "{{query_name}}", "boost": 2.0 } } }, { "match_phrase": { "name": "{{query_name}}" } } ], "minimum_should_match": 1 } }, "functions": [{ "field_value_factor": { "field": "weight", "missing": 0 } }, { "field_value_factor": { "field": "viewCount", "modifier": "ln1p", "missing": 0 }, "weight":2 } ], "score_mode": "sum", "boost_mode": "sum" } } }
索引状态(_cat indices)
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size green open company KTngnM6ASD-_KdU0FFAWRA 1 0 102120019 24166489 47.5gb 47.5gb
问题解答
一、降低index.max_result_window能否提升查询性能?
能,但仅针对**需要深度分页(from+size超过原阈值)**的查询场景:
- 对普通分页查询(比如from=0、size=10)无影响,因为这类查询本来就没触碰到阈值。
- 对尝试获取超过1000条结果的查询,Elasticsearch会直接报错拒绝执行,避免了节点间大量数据排序、传输的开销——这正是性能提升的核心。
- 结合你的1亿+文档的超大索引,若之前存在大量超过10000条的深度分页请求,调整后能显著降低集群的内存与CPU消耗。
二、为什么hits.total.value还是10000?
这是Elasticsearch的默认计数精度限制导致的,和index.max_result_window无关:
- Elasticsearch默认不会精确统计所有匹配文档数,当匹配数超过
track_total_hits的默认阈值(10000)时,会返回阈值上限并标记relation: "gte",表示实际匹配数大于等于该值。 - 你调整的
max_result_window控制的是分页返回的最大结果数,不影响计数阈值。
如果需要精确获取总匹配数,可在查询中设置track_total_hits: true,但注意:针对超大索引,精确计数会带来额外性能开销,需谨慎使用。示例:
{ "track_total_hits": true, "query": { // 你的查询内容 } }
内容的提问来源于stack exchange,提问作者zhuguowei
相关产品推荐
相关产品推荐

