Elasticsearch中long/int类型字段如何实现eq等值查询?
Elasticsearch long类型字段等值查询最佳实现
你当前使用gte+lte同值的range查询虽然可以得到正确结果,但无论可读性还是执行性能都不是最优方案,针对long这类非分词的精确值类型,ES原生提供了更适配的等值查询方式:
推荐方案1:单值等值匹配用term查询
term是ES专门用于精确值匹配的查询,核心是不分词精确匹配,直接匹配字段索引中完全一致的值,不会做分词处理,非常适配数值、布尔、日期、keyword这类精确类型字段,写法比range简洁很多,执行效率也更高:
GET indexname/_search { "query": { "term": { "saleAmount": 801 } } }
如果你的查询不需要计算相关性得分(纯过滤场景),建议把term查询放到bool.filter上下文里,ES会自动缓存常用的过滤结果,查询性能会更好:
GET indexname/_search { "query": { "bool": { "filter": [ {"term": {"saleAmount": 801}} ] } } }
推荐方案2:多值等值匹配用terms查询
如果你需要一次性匹配多个指定数值(比如查saleAmount为801、900、1200的文档),可以用terms查询,支持传入数组形式的多值参数:
GET indexname/_search { "query": { "terms": { "saleAmount": [801, 900, 1200] } } }
不推荐range做等值匹配的原因
- 可读性差:冗余的上下界参数会让其他维护人员误以为是范围查询,无法第一时间识别是等值匹配逻辑
- 性能更低:range查询需要扫描数值索引的区间节点,而term查询可以直接定位到对应数值的倒排记录表,过滤开销更小;放在filter上下文的term查询还能被ES缓存,重复查询性能优势更明显
注意:不要用
match查询做数值等值匹配,match会先走字段的搜索分析流程,虽然对数值类型最终返回结果可能和term一致,但会产生不必要的性能开销。
内容的提问来源于stack exchange,提问作者Joey Yi Zhao
相关产品推荐
相关产品推荐

