Elasticsearch查询中size与track_total_hits的区别是什么?
track_total_hits 与 size 的区别
size的作用很直接——指定你要获取的最大文档条数,比如设为10,就最多返回10条匹配结果,不管实际有多少文档符合查询条件。
而track_total_hits的核心是控制Elasticsearch对匹配查询的总文档数的统计行为,和返回的文档数量无关:
- 当你设置
track_total_hits: true时,ES会精确计算所有匹配的文档总数,哪怕总数几十万、上百万,这会消耗额外的计算资源; - 当你设置
track_total_hits: N(比如10)时,ES只会判断匹配的文档数是否≥N。如果实际匹配数超过N,ES不会去统计精确总数,只会返回total.value = N,同时total.relation = "gte"(表示实际匹配数大于等于N);如果实际匹配数≤N,才会返回精确的总数。
你觉得两者效果一样,是因为当track_total_hits:10且size:10时,ES确实返回了10条结果,但背后逻辑完全不同:
size:10是限制返回的文档条数;track_total_hits:10是让ES跳过精确统计总数的步骤,节省查询性能(数据量越大,这个优化越明显)。
举个实际场景:如果你的查询实际匹配了1000条文档:
- 只设置
size:10,ES会精确算出总共有1000条匹配,再返回前10条; - 同时设置
track_total_hits:10和size:10,ES不会去统计那1000的总数,只告诉你至少有10条匹配,然后返回前10条。
内容的提问来源于stack exchange,提问作者aniketpant
相关产品推荐
相关产品推荐

