当前位置:   article > 正文

elasticsearch打分解析_elasticsearch 评分计算

elasticsearch 评分计算

相关性

什么是相关性
Elasticsearch 的相似度算法被定义为检索词频率/反向文档频率, TF/IDF ,包括以下内容:

  • 检索词频率
    检索词在该字段出现的频率?出现频率越高,相关性也越高。 字段中出现过 5 次要比只出现过 1 次的相关性高。
  • 反向文档频率
    每个检索词在索引中出现的频率?频率越高,相关性越低。检索词出现在多数文档中会比出现在少数文档中的权重更低。
  • 字段长度准则
    字段的长度是多少?长度越长,相关性越低。 检索词出现在一个短的 title 要比同样的词出现在一个长的 content 字段权重更大。

字段长度归一值

字段越短,字段的权重 越高 。
相关度评分背后的理论

以下三个因素——词频(term frequency)、逆向文档频率(inverse document frequency)和字段长度归一值(field-length norm)——是在索引时计算并存储的。最后将它们结合在一起计算单个词在特定文档中的 权重 。

查询时提高权重

bool 查询采取 more-matches-is-better 匹配越多越好的方式,所以每条 match 语句的评分结果会被加在一起,从而为每个文档提供最终的分数 _score 。能与两条语句同时匹配的文档比只与一条语句匹配的文档得分要高。

GET /_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "title": {
              "query": "quick brown fox",
              "boost": 2 
            }
          }
        },
        {
          "match": { 
            "content": "quick brown fox"
          }
        }
      ]
    }
  }
}
//title 查询语句的重要性是 content 查询的 2 倍,因为它的权重提升值为 2 。
//没有设置 boost 的查询语句的值为 1 。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

查询时的权重提升 是可以用来影响相关度的主要工具,任意类型的查询都能接受 boost 参数。将 boost 设置为 2 ,并不代表最终的评分 _score 是原值的两倍;实际的权重值会经过归一化和一些其他内部优化过程。尽管如此,它确实想要表明一个提升值为 2 的句子的重要性是提升值为 1 语句的两倍。

在实际应用中,无法通过简单的公式得出某个特定查询语句的 “正确” 权重提升值,只能通过不断尝试获得。需要记住的是 boost 只是影响相关度评分的其中一个因子;它还需要与其他因子相互竞争。在前例中, title 字段相对 content 字段可能已经有一个 “缺省的” 权重提升值,这因为在 字段长度归一值 中,标题往往比相关内容要短,所以不要想当然的去盲目提升一些字段的权重。选择权重,检查结果,如此反复。

bool 权重计算方式

多字符串查询

bool嵌套查询
评分的计算方式。 bool 查询运行每个 match 查询,再把评分加在一起,然后将结果与所有匹配的语句数量相乘,最后除以所有的语句数量。处于同一层的每条语句具有相同的权重。

GET /_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "title":  "War and Peace" }},
        { "match": { "author": "Leo Tolstoy"   }},
        { "bool":  {
          "should": [
            { "match": { "translator": "Constance Garnett" }},
            { "match": { "translator": "Louise Maude"      }}
          ]
        }}
      ]
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

例子中,包含 translator 语句的 bool 查询,只占总评分的三分之一。如果将 translator 语句与 title 和 author 两条语句放入同一层,那么 title 和 author 语句只贡献四分之一评分。

默认得分

按照逻辑关系命中后相加得分,查看数值,tfidf多少分,tfnorm归一化后多少分

GET / demo_index/ _search {
 explain": true,
 "query": {
  "match": {
   "title": "标题"
  }
 }
}
// explain": true 这个显示具体得分是如何来的

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

权重

多字段查询时权重

GET / demo_index / _search {
 "query": {
  "multi_match": {
   "query": "hello world",
   "fields": ["title^10", "desc"],
   "tie_breaker": 0.3
  }
 }
}
//^10表示权重乘以10
//通过tie_breaker参数,所有匹配的子句都会起作用,只不过最佳匹配子句的作用更大。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

得分算法打分规则

GET / demo_index/ _validate / query ? explain {
 "query": {
  "multi_match": {
   "query": "hello world",
   "fields": ["title", "des"],
   "type": "best_fields"
  }
 }
}
//通过 GET / demo_index/ _validate / query ? explain 
//可以查询打分规则
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
type
  • best_fields
    某一个field匹配尽可能多的关键词的doc优先返回回来(获取最佳匹配的field),另个可以通过tie_breaker来控制其他field的得分
  • most_fields
    尽可能返回更多field匹配到某个关键词的doc,优先返回回来
  • cross_fields
    以分词为单位计算栏位总分
距离计算
//"location":{"type":"geo_point"} 可以是"60,40"
GET _search
{
  "query": {
    "match": {
      "title": "名称"
    }
  },
  "_source": "*",
  "script_fields": {
    "distance": {
      "script": {
        "lang": "expression",
        "params": {"lat":30,"lon":20}
        "source":"haversin(lat,lon,doc['location'].lat,doc['location'].lon)"
      }
    }
  },
  "sort": [
    {
      "_geo_distance": {
        "order": "asc",
        "location":{
          "lat": 30,
          "lon": 20
        },
        "unit": "km",
        "distance_type": "arc"
      }
    }
  ]
}

//distance_type:arc 球形
// 30 20 参数输入
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
sort排序整合对象的评分

这里用酒店搜索举例,距离暂用主导地位
衰减函数 高斯gauss 指数exp 线性lin

  • 使用function_score
  • 使用gauss衰减函数来处理大距离数据
    原始结构
GET _search
{
  "query": {
    "function_score": {
      "query": { //影响召回条件
	    "text": {"query": "hao","boost":0.1} //boost 调节text关键字搜索的相关性score评分占比,让距离可以成为主导
      },
      "functions": [ //仅影响结果排序
        {}
      ]
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

优化参数

	{
		"functions":[
		 {
			"location":{
				"origin":"30,20", //参数 纬度,经度
				"scale":"10km",
				"offset":"0km",
				"decay":0.5
			},
			"weight":9 //距离权重比较高  
		 },
		 {
		 	"field_value_factor":{
		 		"field":"remark_score"  //对象评分 如评分是1-5分,因为高斯是0-1分,这个分数也归一到0-1
		 		"weight":0.2 //评分*weight = 结果 ~ 5*0.2 = 1
		 	}
		 }
		],
		"scroe_mode":"sum" //默认multiply,将 functions中的评分相乘。这里用sum方式,sum的方式,不会让数据太大
		"boost_mode":"sum" //默认multiply,将 functions中的评分和query中的评分相乘。这里用sum方式。
						   //如果boost_mode:replace,那么整个语句的评分score分数就等于functions中的评分
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

衰减图普
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/969678
推荐阅读
相关标签
  

闽ICP备14008679号