Py学习  »  Elasticsearch

Elasticsearch进阶笔记第十三篇

waws520 • 2 年前 • 312 次点击  
阅读 76

Elasticsearch进阶笔记第十三篇

Elasticsearch高手进阶篇(25)

深度探秘搜索技术_深入揭秘TF&IDF算法以及向量空间模型算法

boolean model

  • 类似and这种逻辑操作符,先过滤出包含指定term的doc

    • query "hello world" --> 过滤 --> hello / world / hello & world
    • bool --> must/must not/should --> 过滤 --> 包含 / 不包含 / 可能包含
    • doc --> 不打分数 --> 正或反 true or false --> 为了减少后续要计算的doc的数量,提升性能

TF/IDF

  • 单个term在doc中的分数

    • query: hello world --> doc.content
    • doc1: java is my favourite programming language, hello world !!!
    • doc2: hello java, you are very good, oh hello world!!!
  • hello对doc1的评分

TF: term frequency

  • 找到hello在doc1中出现了几次,1次,会根据出现的次数给个分数
  • 一个term在一个doc中,出现的次数越多,那么最后给的相关度评分就会越高

IDF:inversed document frequency

  • 找到hello在所有的doc中出现的次数,3次
  • 一个term在所有的doc中,出现的次数越多,那么最后给的相关度评分就会越低

length norm(特别注意)

  • hello搜索的那个field的长度,field长度越长,给的相关度评分越低; field长度越短,给的相关度评分越高

最后,会将hello这个term,对doc1的分数,综合TF,IDF,length norm,计算出来一个综合性的分数

hello world --> doc1 --> hello对doc1的分数,world对doc1的分数 --> 但是最后hello world query要对doc1有一个总的分数 --> vector space model

vector space model

  • 多个term对一个doc的总分数

    • hello world --> es会根据hello world在所有doc中的评分情况,计算出一个query vector,query向量
    • hello这个term,给的基于所有doc的一个评分就是2
    • world这个term,给的基于所有doc的一个评分就是5
    • [2, 5]
  • query vector

    • doc vector,3个doc,一个包含1个term,一个包含另一个term,一个包含2个term
    • 3个doc
      • doc1:包含hello --> [2, 0]
      • doc2:包含world --> [0, 5]
      • doc3:包含hello, world --> [2, 5]
  • 会给每一个doc,拿每个term计算出一个分数来,hello有一个分数,world有一个分数,再拿所有term的分数组成一个doc vector

画在一个图中,取每个doc vector对query vector的弧度,给出每个doc对多个term的总分数

image.png

  • 每个doc vector计算出对query vector的弧度,最后基于这个弧度给出一个doc相对于query中多个term的总分数弧度越大,分数越低; 弧度越小,分数越高

  • 如果是多个term,那么就是线性代数来计算,无法用图表示

Elasticsearch高手进阶篇(26)

深度探秘搜索技术_深入揭秘lucene的相关度分数算法

我们boolean modelTF/IDFvector space model

深入讲解TF/IDF算法,在lucene中,底层,到底进行TF/IDF算法计算的一个完整的公式是什么?

boolean model

 query: hello world
 ​
 "match": {
     "title": "hello world"
 }
 ​
 "bool": {
     "should": [
         {
             "match": {
                 "title": "hello"
             }
         },
         {
             "match": {
                 "title": "world"
             }
         }
     ]
 }
复制代码

普通multivalue搜索,转换为bool搜索,boolean model

lucene practical scoring function

practical scoring function,来计算一个query对一个doc的分数的公式,该函数会使用一个公式来计算

image.png

  • score(q,d) score(q,d) is the relevance score of document d for query q.

    • 这个公式的最终结果,就是说是一个query(叫做q),对一个doc(叫做d)的最终的总评分
  • queryNorm(q) is the query normalization factor (new).

    • queryNorm是用来让一个doc的分数处于一个合理的区间内,不要太离谱,举个例子,一个doc分数是10000,一个doc分数是0.1,比较离谱
  • coord(q,d) is the coordination factor (new).

    • 简单来说,就是对更加匹配的doc,进行一些分数上的成倍的奖励
  • The sum of the weights for each term t in the query q for document d.

    • ∑:求和的符号
      • ∑ (t in q):query中每个term,query = hello world,query中的term就包含了hello和world
      • query中每个term对doc的分数,进行求和,多个term对一个doc的分数,组成一个vector space
  • tf(t in d) is the term frequency for term t in document d.

    • 计算每一个term对doc的分数的时候,就是TF分数
  • idf(t) is the inverse document frequency for term t.

    • 计算每一个term对doc的分数的时候,就是IDF分数
  • t.getBoost() is the boost that has been applied to the query (new).

    • 是我们之前进行指定的权重部分,影响分数
  • norm(t,d) is the field-length norm, combined with the index-time field-level boost, if any. (new).

    • 看我们匹配到的长度,长度越长,分数越低;长度越短,分数越高

query normalization factor

image.png

  • sumOfSquaredWeights = 所有term的IDF分数之和,开一个平方根,然后做一个平方根分之1

    • 主要是为了将分数进行规范化
      • 开平方根,首先数据就变小了
      • 然后还用1去除以这个平方根,分数就会很小
      • 1.几 / 零点几,分数就不会出现几万,几十万,那样的离谱的分数

query coodination

奖励那些匹配更多字符的doc更多的分数

  • 原始计算方式

    • Document 1 with hello → score: 1.5
    • Document 2 with hello world → score: 3.0
    • Document 3 with hello world java → score: 4.5
  • 进行奖励的计算方式

    • Document 1 with hello → score: 1.5 * 1 / 3 = 0.5
    • Document 2 with hello world → score: 3.0 * 2 / 3 = 2.0
    • Document 3 with hello world java → score: 4.5 * 3 / 3 = 4.5

把计算出来的总分数 * 匹配上的term数量 / 总的term数量,让匹配不同term/query数量的doc,分数之间拉开差距

  • 将那些匹配更多terms的数据的分数有所提升,将匹配的term比较少的doc的分数向下排名
  • 这也就是之前有多terms比精准的匹配到数据的那个分数高的原因

field level boost

对某些filed匹配到的字段分配不同的分数计算权重

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/119082
 
312 次点击