当前位置: 首页 > news >正文

ES踩了一坑 script查询与float类型的精度

今天ES需要查询一个比例的计算, 逻辑也简单, 就是: receivableAmountinvoiceMoney ✖️100%

使用_doc查询id时, 可以看到receivableAmount 值为6.38, invoiceMoney 值为 10, 结果一目了然是63.8%

但是输入区间查询时, 怎么查也查不出来, 震惊整个小组!!!

查询json如下:

{"query": {"bool": {"must": [{"script": {"script": {"source": "try {    if (doc.containsKey('receivableAmount') && doc.containsKey('invoiceMoney')) {        double ra = (doc['receivableAmount'].value)*1.00;        double im = doc['invoiceMoney'].value;   if(im <= 0){return false;}     double rate = ra / im * 100;      return rate >= params.minRatio&&rate<params.maxRatio;   }    return false;} catch (Exception e) {    return false;}","params": {"minRatio": 63.795,"maxRatio": 63.804}}}}]}}}

百思不得其解之下, 我试着把运算过程中的值都打印一下, 你猜怎么着?
查询json:

{"query": {"bool": {"must": [{"script": {"script": {"source": "try {    if (doc.containsKey('receivableAmount') && doc.containsKey('invoiceMoney')) {        double ra = (doc['receivableAmount'].value)*1.00;        double im = doc['invoiceMoney'].value;   if(im <= 0){return false;}     double rate = ra / im * 100;      return rate >= 0;   }    return false;} catch (Exception e) {    return false;}","params": {"minRatio": 63.795,"maxRatio": 63.804}}}}]}},"script_fields": {"calculated_ratio": {"script": {"source": "if (doc['invoiceMoney'].size() == 0 || doc['invoiceMoney'].value == 0) return -1; return (doc['receivableAmount'].value / doc['invoiceMoney'].value) * 100.00;"}},"receivableAmount": {"script": {"source": "return doc['receivableAmount'].value;"}},"invoiceMoney": {"script": {"source": "return doc['invoiceMoney'].value;"}}}}

receivableAmount 在实际运算过程中, 它值居然是 6 ?! wtf, 和我们_doc查询时看到的完全是两码事!

接着, 我去看了一下索引的映射信息, 发现有个同事搞错了, 它的字段精度是1

"receivableAmount": {"type": "scaled_float","scaling_factor": 1
}

呵呵, 无语得我想笑…

啥也不说了, 调整字段类型, 重建索引吧.

这也是ES埋得比较深的坑之一.

http://www.dtcms.com/a/609574.html

相关文章:

  • ASC学习笔记0015:此能力系统组件是否具有此属性?
  • 如何基于DSL脚本进行elasticsearch向量检索示例
  • 如何利用大语言模型(LLM)实现自动标注与内容增强
  • h5网站有哪些网页设计公司的目标客户有哪些
  • 做网站推广合同做标志的网站
  • 【ZeroRange WebRTC】Amazon Kinesis Video Streams WebRTC Data Plane REST API 深度解析
  • 2025从部署到迭代:Deepseek知识库部署服务商如何护航企业知识管理?
  • 检索增强微调(RAFT)如何重塑慢病健康管理?——从技术原理到落地实践
  • 网站开发 工作量评估关于建设网站安全性合同
  • 学Java第四十四天——可变参数、Collections工具类
  • XQuery FLWOR + HTML:深入理解与实际应用
  • 风丘助力优化ADAS测试:多路雷达、视频及车辆总线数据的集成处
  • LeetCode 152. 乘积最大子数组
  • XTDIC-SPARK高速3D测量系统在电子产品跌落测试中的动态变形与可靠性评估
  • Java设计模式之原型模式深度解析
  • 设置网站关键词怎么做高端大气网站源码
  • 网站内链建设不可忽视的地方零基础短视频制作培训
  • php做企业网站管理系统网络营销的特征和功能
  • 【WSL】继承Windows科学流量
  • 可复用的 Vue 3 + TypeScript + Element Plus 的列表请求(列表页/表格)通用方案
  • 安装 Composer
  • 国外做名片的网站网站没有备案
  • 解决VMware Workstation虚拟机中添加硬盘时找不到U盘对应的磁盘physicaldrive3
  • 解决 “Could not locate zlibwapi.dll” 错误全流程分析
  • 第一模板ppt免费下载seo人员工作内容
  • 【高级机器学习】 7. 带噪声数据的学习:从 MLE 到 MAP
  • 横沥镇做网站北京公司注册地址出租
  • 北湖区网站建设哪个好中网互联网站建设
  • @Autowired和@Resource的区别
  • MongoDB | python操作MongoDB的基础使用