es 的默认打分机制依靠lucene的打分机制- TF/IDF(词频/逆向文档频率)

计算公式:

score(q,d)  =   
            queryNorm(q)            //归一化因子
          · coord(q,d)              //协调因子
          · ∑ (           
                tf(t in d)          //词频
              · idf(t)²             //逆向文档频率
              · t.getBoost()        //权重
              · norm(t,d)           //字段长度归一值
            ) (t in q) 

来自:https://blog.csdn.net/paditang/article/details/79098

  • 词频:

    词在文档中出现的频度是多少? 频度越高,权重 越高 。 5 次提到同一词的字段比只提到 1 次的更相关。词频的计算方式如下: tf(t in d) = √frequency , 词 t 在文档 d 的词频( tf )是该词在文档中出现次数的平方根。

    将参数 index_options设置为docs可以禁用词频统计及词频位置,这个映射的字段不会计算词的出现次数,对于短语或近似查询也不可用。要求精确查询的not_analyzed 字符串字段会默认使用该设置。

  • 逆向文档频率

    词在集合所有文档里出现的频率是多少?频次越高,权重 越低 。 常用词如 and 或 the 对相关度贡献很少,因为它们在多数文档中都会出现,一些不常见词如 elastic 或 hippopotamus 可以帮助我们快速缩小范围找到感兴趣的文档。逆向文档频率的计算公式如下: idf(t) = 1 + log ( numDocs / (docFreq + 1))

    词 t 的逆向文档频率(idf)是:索引中文档数量除以所有包含该词的文档数,然后求其对数。

  • 文档长度归一值

    字段的长度是多少? 字段越短,字段的权重 越高 。如果词出现在类似标题 title 这样的字段,要比它出现在内容 body 这样的字段中的相关度更高。字段长度的归一值公式如下:

    norm(d) = 1 / √numTerms

    字段长度归一值( norm )是字段中词数平方根的倒数。

  • queryNorm 查询归化因子:会被应用到每个文档,不能被更改,总而言之,可以被忽略。

  • coord 协调因子: 可以为那些查询词包含度高的文档提供奖励,文档里出现的查询词越多,它越有机会成为好的匹配结果。 协调因子将评分与文档里匹配词的数量相乘,然后除以查询里所有词的数量,如果使用协调因子,评分会变成:

    文档里有 fox → 评分: 1.5 * 1 / 3 = 0.5
    文档里有 quick fox → 评分: 3.0 * 2 / 3 = 2.0
    文档里有 quick brown fox → 评分: 4.5 * 3 / 3 = 4.5
    协调因子能使包含所有三个词的文档比只包含两个词的文档评分要高出很多。
    
  • Boost 权重:在查询中设置关键字的权重可以灵活的找到更匹配的文档。

还有很多很多算法,也能干预这些算法,还可以自己写一个算法,以后再说,