欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > es的range失效

es的range失效

2025/4/28 19:49:08 来源:https://blog.csdn.net/csynsgh/article/details/147461424  浏览:    关键词:es的range失效

es的range失效的解决方法

问题描述

当我们es使用keyword类型存储数字时,当我们使用range时我们发现range失效的问题,例如以下的用例:

我们创建一个test1的索引test1:

image-20250423190453040

使用_bulk进行批量导入数据:

image-20250423190504390

进行查询我们发现我们要使用range进行0-5000的范围查询,但发现10000出现了

image-20250423190558050

这是为什么呢?

原因解释:因为es的keyword的字符串比较是按字典序进行的(“100” < “20” 因为 ‘1’ < ‘2’),同理5000>10000是因为5>1

如何解决呢?

正确解决方案

方案1:重新映射字段为数值类型(推荐)

PUT /products/_mapping
{"properties": {"price": {"type": "float"  // 或 "integer"}}
}

然后使用数值类型的 range 查询。

方案2:使用脚本转换字符串为数值(性能较差)

GET /products/_search
{"query": {"script": {"script": {"source": "Double.parseDouble(doc['price'].value) >= params.min && Double.parseDouble(doc['price'].value) <= params.max","params": {"min": 100,"max": 500}}}}
}

方案3:使用标准化格式存储文本价格(次优方案)

如果必须保持文本类型,确保所有价格:

  • 统一小数位数(如都保留2位:100.00)
    化格式存储文本价格(次优方案)

如果必须保持文本类型,确保所有价格:

  • 统一小数位数(如都保留2位:100.00)
  • 统一数字

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词