Elasticsearch:搜索相关性
这里写目录标题
- 一、相关性的概述
- 二、自定义评分策略
- 1、TF-IDF算法
- 2、BM25算法
- 三、自定义评分策略
- 1、Index Boost:在索引层面修改相关性
- 2、boosting:修改文档相关性
- 3、negative_boost:降低相关性
- 4、function_score:自定义评分
- 5、rescore_query:查询后二次打分
- 四、多字段搜索场景优化
- 1、最佳字段(Best Fields): 多个字段中返回评分最高的
- 2、多数字段(Most Fields):匹配多个字段,返回各个字段评分之和
- 3、混合字段(Cross Fields):跨字段匹配,待查询内容在多个字段中都显示
一、相关性的概述
在搜索引擎中,描述一个文档与查询语句匹配程度的度量标准。
二、自定义评分策略
Elasticsearch5之前的版本,评分机制或者打分模型是基于TF-IDF实现的。从Elasticsearch5之后,默认的打分机制改成了Okapi BM25。
1、TF-IDF算法
- TF是词频:检索词在文档中出现的频率越高,相关性也越高。
- IDF是逆向文本频率:每个检索词在索引中出现的频率,频率越高,相关性越低。
- 字段长度归一值:检索词出现在一个内容短的title要比同样的词出现在一个内容长的content字段权重更大。
2、BM25算法
和经典的TF-IDF相比,当TF无限增加时,BM25算分会趋于一个数值。
三、自定义评分策略
1、Index Boost:在索引层面修改相关性
Index Boost这种方式能在跨多个索引搜索时为每个索引配置不同的级别。所以它适用于索引级别调整评分。
实战举例:一批数据里有不同的标签,数据结构一致,要将不同的标签存储到不同的索引(A、B、C),并严格按照标签来分类展示(先展示A类,然后展示B类,最后展示C类),应该用什么方式查询呢?
具体实现:借助indices_boost提升索引的权重,让A排在最前,其次是B,最后是C。
2、boosting:修改文档相关性
boosting可在查询时修改文档的相关度。boosting值所在的范围不同,含义也不同。
- 若boosting值为0~1,如0.2,代表降低评分。
- 若boosting值>1,如1.5,则代表提升评分。
适用于某些特定的查询场景,用户可以自定义修改满足某个查询条件的结果评分。
3、negative_boost:降低相关性
若对某些返回结果不满意,但又不想将其排除(must_not),则可以考虑采用negative_boost的方式。
原理如下:
- negative_boost仅对查询中定义为negative的部分生效。
- 计算评分时,不修改boosting部分评分,而negative部分的评分则乘以negative_boost的值。
- negative_boost取值为0~1.0。
4、function_score:自定义评分
该方式支持用户自定义一个或多个查询语句及脚本,达到精细化控制评分的目的,以对搜索结果进行高度个性化的排序设置。适用于需进行复杂查询的自定义评分业务场景。
5、rescore_query:查询后二次打分
二次评分是指重新计算查询所返回的结果文档中指定文档的得分。Elasticsearch会截取查询返回前N条结果,并使用预定义的二次评分方式来重新计算其得分。但对全部有序的结果集进行重新排序的话,开销势必很大,使用rescore_query可以只对结果的子集进行处理。该方式适用于对查询语句的结果不满意,需要重新打分的场景。
四、多字段搜索场景优化
1、最佳字段(Best Fields): 多个字段中返回评分最高的
当字段之间相互竞争,又相互关联。例如:对于博客的title和body这样的字段,评分来自最匹配字段。
2、多数字段(Most Fields):匹配多个字段,返回各个字段评分之和
处理英文内容时的一种常见的手段是,在主字段(English Analyzer),抽取词干,加入同义词,以匹配更多的文档。相同的文本,加入字段(standard Analyzer),以提供更加精确的匹配。其他字段作为匹配文档提高相关度的信号,匹配字段越多则越好。
3、混合字段(Cross Fields):跨字段匹配,待查询内容在多个字段中都显示
对于某些实体,例如人名,地址,图书信息。需要在多个字段中确定信息,单个字段只能作为整体的一部分。希望在任何这些列出的字段中找到尽可能多的词。