一,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版权协议,转载请附上原文出处链接和本声明。