ES之深入思考-算分算法相关

一,es算分算法简介。

es5之前采用的算法是 TF-IDF算法。

TF是词频,表示搜索关键词在所有文章中出现的次数。

TF = count(关键词) / count(所有词)

IDF称之为逆文档词频,计算方法是对出现关键词的文章书和所有文章数的比例取对数。

IDF =log(count(所有文章)/ count(关键词出现的文章))

IDF能把一些没有实际意义的语气词、助词等的干扰排除,比如“的”这样的副词基本可以认为每篇文章都会出现, IDF趋近与0.

通过下面log函数的图像结合IDF的公式可以看出,关键词出现的次数越低,IDF值越高。
在这里插入图片描述

相关度算法:
在这里插入图片描述

TF-IDF = TF(关键词1)*IDF(关键词1) + TF(关键词2)*IDF(关键词2)

TF-IDF算法有一个问题在于,随着TF无限增加时,相关度算法会无限增加。所以es5以后采用了BM25算法。

一,包含查询字段的document数量对算分的影响

第一种查询方式:multi_query,best_fields

blog索引有5个document,其中有两条如下:
在这里插入图片描述
执行如下查询:

POST blog/_search
{
  "explain": true, 
    "query": {
      "multi_match": {
        "query": "love cat",
        "type": "best_fields", 
        "fields": ["title","content"]
      }
    }
}

用的是best_fields,本意是找到相关度更高的文档,显然第二个文档的title包含love 和 cat,相关度更高,但结果(如下图)却是一个文档的得分更高。

在这里插入图片描述

在查询中加上参数explain,发现区别在于包含content字段的文档一共有5个,而包含title的文档只有2个。

算分过程:
先针对字段content算分,cat在id为4的文档中出现了1次,在为5的文档中没有出现,所以id为4的算分更高,算分为1.464436。

先针对字段title算分,cat在id为4的文档中出现了0次,在为5的文档中没有出现,所以id为4的算分更高。
在这里插入图片描述

第二种查询方式:disjunction query

POST blog/_search
{
  "query": {
    "dis_max": {
      "queries": [
         {"match":{
           "title":"cat love"
         }
           
         } ,
         {"match":{
           "title":"cat love"
         }
         } 
      ],
      "tie_breaker": 0.7
    }
  }
}

版权声明:本文为epitomizelu原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。