elasticsearch 打分 源码_elasticsearch 打分精度-阿里云开发者社区

文章探讨了Elasticsearch中默认使用float类型作为文档相关度分数的原因,指出由于IEEE754浮点数精度限制,当分数涉及大范围计算时可能会导致不准确。作者提到Lucene底层打分机制使用float,因此Elasticsearch也受限于此。为解决此问题,作者提到了可能需要修改Lucene源代码,并提供了一个潜在的补丁链接,但未尝试。对于分数精度要求高的场景,这可能成为一个挑战。
摘要由CSDN通过智能技术生成

elasticsearch 原文

What Is Relevance?edit

We’ve mentioned that, by default, results are returned in descending order of relevance. But what is relevance? How is it calculated?

The relevance score of each document is represented by a positive floating-point number called the _score. The higher the _score, the more relevant the document.

所以,elasticsearch中分数是 浮点类型的 。

IEEE 754

这里就不细说什么是IEEE 754了,就直接讲具体内容,有兴趣的可以自己百度。

float

符号位(S):1bit  指数位(E):8bit  尾数位(M):23bit

float的尾数:23位,其范围为:0~223,而223=8388608,所以float的精度为6~7位,能保证6位为绝对精确,7位一般也是正确的,8位就不一定了(但不是说8位就绝对不对了)

那为什么elasticsearch 要用float呢,看了一下源代码 FiltersFunctionFactorScorer 类

看到computeScore 还是double 类型的,但是 return scoreCombiner.combine 却变成了float,

继续看

可见,进行了强转,那如果要修改为double 该如何操作呢,FiltersFunctionFactorScorer 继承了FilterScorer

而FilterScorer 的包为org.apache.lucene.search,可见是因为lucene 的打分是float,所以elasticsearch 的打分也只能是float,谁让elasticsearch 是基于lucene 的呢。所以你如果要修改分数为double类型,最根源还是要修改lucene 的源代码。网上有人对lucene 做了一个patch,但还没有尝试。地址为:https://issues.apache.org/jira/browse/LUCENE-5596。

我目前用的elasticsearch 的版本是2.3.5, 或许后续的版本会修复这个问题。

所以如果打分因子范围过亿,恭喜你,分数已经已经不准了。

本文转自whk66668888 51CTO博客,原文链接:http://blog.51cto.com/12597095/1932294

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值