搜索的相关性算分,描述了一个文档和查询语句匹配成都;es 会对每个匹配条件的结果进行算分,打分的本质是排序;5之前采用TF-IDF,后面采用BM 25;
(*注意:往往分词器分词的结果也会对得分产生影响,可以先看看分词的结果再去判断评分)
TF-IDF
是一种用于信息检索与数据挖掘的常用加权技术;
计算公式:
TF是词频;
IDF是逆向文本率:每个检索词在索引中出现的频率,频率越高,相关性越低;(指的是整个文档中的占比)十篇文章中都有结果和一篇文章中有结果,显然一篇文章有结果相关性更强;
字段长度归一值:字段越短,字段占比越高,相关度越高;
BM25 算法
主要针对词频的增加,评分增加逐渐趋于平缓的优化;
GET /索引名称/_search
{
"explain":true,
"query":{
"match":{
"title":"java设计模式"
}
},
"size":10
}
Boosting是控制相关度的一种手段;
参数boost的含义:
当boost > 1时,打分的权重相对性提升
当0 < boost <1时,打分的权重相对性降低
当boost <0时,贡献负分
返回匹配positive查询的文档并降低匹配negative查询的文档相似度分。
GET /test_score/_search
{
"query":{
"boosting":{
"positive":{
"term":{
"content":"elasticsearch"
}
},
"negative":{
"term":{
"content":"like"
}
},
"negative_boost":0.2
}
}
}
"negative_boost":0.2
内容包含like的得分乘以0.2;
一个bool查询是一个或多个查询子句组合;
a、must: 必须匹配,共享算分;
b、should:选择性匹配 相当于或 贡献算分;
c、must_not:必须不匹配,不贡献
d、filter:必须匹配,不贡献算分
Query和filter4两种不同的上线文:Query 相关性算分,filter不需要算分,可以利用Cache,性能更好;
复合查询语句的相关性评分是将子查询语句合并得到的结果;
GET /索引名/_search
{
"query":{
"bool":{
"must":{
"match":{
"remark":"java"
}
},
"filter":{
"term":{
"sex":"1"
}
},
"must_not":{
"range":{
"age":{
"gte":30
}
}
},
"should":[
{
"term":{
"address.keyword":{
"value":"安徽"
}
}
},
{
"term":{
"address.keyword":{
"value":"安徽合肥"
}
}
}
],
"minimum_should_match":1
}
}
}
使用bool查询控制算分
GET /索引名/_search
{
"query":{
"bool":{
"should":[
{
"match":{
"title":{
"query":"apple,ipad",
"boost":1
}
}
},
{
"match":{
"content":{
"query":"apple,ipad",
"boost":4
}
}
}
]
}
}
}