赞
踩
什么是相关性
Elasticsearch 的相似度算法被定义为检索词频率/反向文档频率, TF/IDF ,包括以下内容:
字段越短,字段的权重 越高 。
相关度评分背后的理论
以下三个因素——词频(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 。
查询时的权重提升 是可以用来影响相关度的主要工具,任意类型的查询都能接受 boost 参数。将 boost 设置为 2 ,并不代表最终的评分 _score 是原值的两倍;实际的权重值会经过归一化和一些其他内部优化过程。尽管如此,它确实想要表明一个提升值为 2 的句子的重要性是提升值为 1 语句的两倍。
在实际应用中,无法通过简单的公式得出某个特定查询语句的 “正确” 权重提升值,只能通过不断尝试获得。需要记住的是 boost 只是影响相关度评分的其中一个因子;它还需要与其他因子相互竞争。在前例中, title 字段相对 content 字段可能已经有一个 “缺省的” 权重提升值,这因为在 字段长度归一值 中,标题往往比相关内容要短,所以不要想当然的去盲目提升一些字段的权重。选择权重,检查结果,如此反复。
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" }} ] }} ] } } }
例子中,包含 translator 语句的 bool 查询,只占总评分的三分之一。如果将 translator 语句与 title 和 author 两条语句放入同一层,那么 title 和 author 语句只贡献四分之一评分。
按照逻辑关系命中后相加得分,查看数值,tfidf多少分,tfnorm归一化后多少分
GET / demo_index/ _search {
explain": true,
"query": {
"match": {
"title": "标题"
}
}
}
// explain": true 这个显示具体得分是如何来的
多字段查询时权重
GET / demo_index / _search {
"query": {
"multi_match": {
"query": "hello world",
"fields": ["title^10", "desc"],
"tie_breaker": 0.3
}
}
}
//^10表示权重乘以10
//通过tie_breaker参数,所有匹配的子句都会起作用,只不过最佳匹配子句的作用更大。
GET / demo_index/ _validate / query ? explain {
"query": {
"multi_match": {
"query": "hello world",
"fields": ["title", "des"],
"type": "best_fields"
}
}
}
//通过 GET / demo_index/ _validate / query ? explain
//可以查询打分规则
//"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 参数输入
这里用酒店搜索举例,距离暂用主导地位
衰减函数 高斯gauss 指数exp 线性lin
GET _search
{
"query": {
"function_score": {
"query": { //影响召回条件
"text": {"query": "hao","boost":0.1} //boost 调节text关键字搜索的相关性score评分占比,让距离可以成为主导
},
"functions": [ //仅影响结果排序
{}
]
}
}
}
优化参数
{ "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中的评分 }
衰减图普
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。