相关度评分背后的理论
// 附录8
总述: 匹配文档+实用评分函数打分
Lucene(或 Elasticsearch)使用 布尔模型(Boolean model) 查找匹配文档,
并用一个名为 实用评分函数(practical scoring function) 的公式来计算相关度。
这个公式借鉴了 词频/逆向文档频率(term frequency/inverse document frequency) 和 向量空间模型(vector space model),
同时也加入了一些现代的新特性,如协调因子(coordination factor),字段长度归一化(field length normalization),以及词或查询语句权重提升。
字段长度归一化
什么是相关性?&explain // TODO
https://www.cnblogs.com/yudidi/p/12841277.html
基本过程
查询结果
对查询结果打分
单个词查询的打分过程:
一个多词查询的打分过程 TODO
修改打分的方法
- 在match中使用boost关键字为不同的字段设置不同的重要性
- 在query-bool-should-某个字段的match语句中设置2个字段boost分为2和1,表示前1个字段比后一个字段重要2倍。 // 附录4
{
"query": {
"bool": {
"should": [
{
"match": {
给字段title设置boost值=2
}
},
{
"match": {
"content": "quick brown fox"
// content字段,默认boost=1.
}
}
]
}
}
}
title 查询语句的重要性是 content 查询的 2 倍,因为它的权重提升值为 2 。
没有设置 boost 的查询语句的值为 1 。
- 调整查询结构中查询语句的所处层次,从而或多或少改变其重要性。 // 附录5
// quick OR brown OR red OR fox
"should": [
{ "term": { "text": "quick" }},
{ "term": { "text": "brown" }},
{ "term": { "text": "red" }},
{ "term": { "text": "fox" }}
]
=>
// quick OR (brown OR red) OR fox
"should": [
{ "term": { "text": "quick" }},
{ "term": { "text": "fox" }},
{
"bool": {
"should": [
{ "term": { "text": "brown" }},
{ "term": { "text": "red" }}
]
}
}
]
-
通过boosting的negative对包含负向词的文档降权。// 附录6
为了达到效果, negative_boost 的值必须小于 1.0 。在这个示例中,所有包含负向词的文档评分 _score 都会减半。 -
constant_score忽略TF/IDF
略
5. function_score 终极武器
综述:
- 它允许为每个与
主查询匹配
的文档应用一个或多个函数,以达到改变甚至完全替换原始查询评分 _score
的目的。 - function_score查询允许用户指定任何数量的任意函数
functions
,让它们作用于匹配了初始查询的文档,修改其得分。
-
5.1 weight关键字
Q: function_score的weight和boost关键字的作用方式不同。
A: weight函数将得分乘以一个常数。注意,普通的boost字段按照标准化来增加分数,而weight是真正将得分乘以确定的数值。 -
5.2 functions关键字
指定一个函数,函数内使用weight //附录7
指定多个函数,每个函数内使用weight // 附录9 -
5.3 得分合并
得分合并有以下两种情况:
从每个单独的函数而来的得分是如何合并的,这被称为score_mode。
从函数而来的得分是如何同原始查询得分合并的,这被称为boost_mode。 -
5.4 field_value_factor函数
全部的关键字如下
"field_value_factor": {
"field": "votes",
"modifier": "log1p",
"factor": 0.1
},
"boost_mode": "sum",
"max_boost": 1.5
- 5.5 function_score+functions的书写格式 //附录10
{
"query": {
"function_score": {
"query": {
"match_all": {}
},
"functions": [
{
"weight": 1.5,
"filter": {
"term": {
"description": "hadoop"
}
}
},
{
"field_value_factor": {
"field": "reviews",
"factor": 10.5,
"modifier": "log1p",
"missing": 0
}
},
{
"script_score": {
"script": {
"source": "if (doc[\u0027attendees\u0027].value != null) { Math.log(doc[\u0027attendees\u0027].values.size() * params.myweight)} else _score",
"params": {
"myweight": 3
}
}
}
},
{
"gauss": {
"location_event.geolocation": {
"origin": "40.018528,-105.275806",
"offset": "100m",
"scale": "2km",
"decay": "0.5"
}
}
}
],
"score_mode":"sum",
"boost_mode":"replace"
}
}
}
- 5.6 脚本打分 //TODO
ES打分机制和es的function_score(TODO)
https://www.elastic.co/guide/en/elasticsearch/reference/6.3/query-dsl-function-score-query.html#
ES打分机制
- TF-IDF算法计算文档得分 // 附录1: 基本上就是网页排名(pagerank)*相关性(TF-IDF)。
boost_mode
"boost_mode": "multiply", // query score and function score is multiplied (default)
参考
- 数学之美-第11章 如何确定网页和查询的相关性。
- 查询打分和自定义打分相乘得最终得分
- 触类旁通Elasticsearch:打分
- boost关键提升字段权重
- 调整should语句的组合关系, quick OR (brown OR red) OR fox
- 所有包含负向词的文档评分 _score 都会减半
- weight*_score,但是boost按照标准化来增加分数TODO--五、function_score
- bool匹配,
- 五、function_score--functions--多个函数
- (7)综合示例