You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 08:15:34