用户在使用搜索功能时,最关心的就是搜索引擎能否根据搜索关键字,找出最匹配的搜索结果;
而搜索引擎可以根据调整搜索的相关性,来控制返回不同的搜索结果;
搜索结果的相关性,例如:
- 是否可以找到所有相关的内容;
- 有多少不想管的内容被返回了;
- 文档的打分是否合理;
- 结合业务需求,平衡结果排名;
- Web 搜索,不仅仅要考虑内容的相关性,更重要的是内容的可靠度,综合相关性更高的展示在前面;
- 电商搜索,不仅仅为用户提供搜索服务,搜索还扮演了销售的角色,向客户推荐新商品,去库存等;
1. 相关度指标
- Precision 查准率
- 尽可能返回较少的无关文档;
- Recall 查全率
- 尽量返回较多的相关文档;
- Ranking 排名
- 是否能够按照相关度进行排序?
2. 相关度算分
- 搜索的相关性算分,描述了一个文档与查询语句匹配的程度。ES 会对每个匹配查询条件的结果进行算分 _score;
- 打分的本质就是排序,需要把最符合用户需求的文档排在前面。ES 5 之前,默认的相关性算分采用 TF-IDF,ES 6.0 起采用 BM 25;
2.1 词频 TF
Term Frequency:检索词在一篇文档中出现的频率
- 词频 = 检索词出现的次数 / 文档的总字数;
度量一条查询和结果文档相关性的简单方法:简单将搜索中的每一个词的 TF 进行相加
- TF(区块链) + TF(的) + TF(应用);
Stop Word
DF,Document Frequency:检索词在所有文档中出现的频率;
- “区块链”在相对比较少的文档中出现
- “应用”在相对比较多的文档中出现
- “Stop Word”在大量的文档中出现
IDF,Inverse Document Frequency:简单说 = log( 全部文档 / 检索词出现过的文档总数 );
TF-IDF 本质就是将 TF 求和变成了加权求和
- TF(区块链)IDF(区块链) + TF(的)IDF(的) + TF(应用)*IDF(应用);
2.3 Lucene 中的 TF-IDF 评分公式
现代搜索引擎,对 TF-IDF 进行了大量细微的优化。ES 5 之前的版本就是采用的 TF-IDF。
2.4 BM 25 评分算法
- 从 ES 6.0 起,默认算法改为了 BM 25;
和经典的 TF-IDF 相比,当 TF 无限增加时,BM 25 算分会趋于一个数值;
在 Elasticsearch 中定制相关度算法的参数,定制 Similarity:
- K 默认值是 1.2,数值越小饱和度越高,b 默认值是 0.75(取值范围 0-1),0 代表禁止 Normalization;
PUT /my_index
{
"settings": {
"similarity": {
"custom_similarity": {
"type": "BM25",
"b": 0,
"k1": 2
}
}
},
"mappings": {
"doc": {
"properties": {
"custom_text": {
"type": "text",
"similarity": "custom_similarity"
},
"default_text": {
"type": "text"
}
}
}
}
}
2.6 Boosting Relevance
- K 默认值是 1.2,数值越小饱和度越高,b 默认值是 0.75(取值范围 0-1),0 代表禁止 Normalization;
Boosting 是控制相关度的一种手段
- ES 中可以对索引,字段,或查询子条件,分别设置 Boosting 参数
参数 boosting 的含义
- 当 boost > 1 时,打分的相关度相对性提升;
- 当 0 < boost <1 时,打分的权重相对性降低;
- 当 boost < 0 时,贡献负分;
POST testscore/_search
{
"query": {
"boosting": {
"positive": {
"term": {
"content": "elasticsearch"
}
},
"negative": {
"term": {
"content": "like"
}
},
"negative_boost": 0.2
}
}
}