ES中的倒排索引与相关性算法计算(TF-IDF/BM25)

一、倒排索引

daopai.png

上图所示左边为正常索引,右边为倒排索引。

倒排索引的核心组成

  • 单词词典(Term Dictionary),记录所有文档的单词,记录单词到到排列表的关联关系。

    • 单词词典一般比较大,可以通过B+树或者哈希拉链法实现,以满足高性能的插入与查询
  • 倒排列表(Posting List)-记录了单词对应的文档结合,由倒排索引项组成

    • 倒排索引项

      • 文档ID
      • 词频TF - 该单词在文档中出现的次数,用于相关性评分
      • 位置(Position) - 单词在文档中分词的位置。用于语句搜索(phrase query)
      • 偏移(offset) - 记录单词的开始结束位置,实现高亮显示

es倒排索引.png

​ 单词Elasticsearch的倒排索引列表

二、相关性与相关性算分

相关性-Relevance

  • 搜索的相关性算分,描述了一个文档和查询语句的匹配程度。ES会对每个匹配查询条件的结果进行算分_score
  • 打分的本质是排序,需要把最符合用户需求的文档排在前面。ES5之前,默认的相关性算分采用TF-IDF,现在采用BM25

词频TF

Term Frequency:检索此在一篇文档中出现的频率

  • 检索词出现的次数除以文档的总字数

度量一条查询和结果文档相关性的简单方法:简单将搜索中的每一个词的TF进行想加,例如:查询 区块链的应用

  • TF(区块链)+TF(的)+TF(应用)

Stop Word

  • “的”在文档中出现了很多次,但是对贡献相关度几乎没有用处,不应该考虑他们的TF

逆文档频率(IDF)

DF:检索词在所有文档中出现的频率

  • “区块链”在相对比较少的文档中出现
  • “应用”在相对比较多的文档中出现
  • “stop word”在大量文档中出现

Inverse Document Frequency:简单说=log(全部文档数/检索词出现过的文档总数)

TF-IDF本质上就是将TF求和变成了加权求和

  • TF(区块链)*IDF(区块链)+TF(的)* IDF(的)+TF(区块链)*IDF(区块链)

TF-IDF.png

TFid公式.png

BM25

TFbm25.png

定制Similarity计算公式

定制评分公式.png

查询小助手

可以通过“explain”参数查看打分状况

POST /testscore/_search
{
  //"explain": true,
  "query": {
    "match": {
      "content":"you"
      //"content": "elasticsearch"
      //"content":"the"
      //"content": "the elasticsearch"
    }
  }
}

使用boost控制相关度评分

boost.png

参考极客时间elasticsearch视频

标签: none

评论已关闭