什么是相关性
相关度是指两个事物间相互关联的程度,在检索领域特指检索请求与检索结果之间的相关程度。默认情况下,返回结果是按相关性倒序排列的。 但什么是相关性? 相关性如何计算?
每个文档都有相关性评分,用一个正浮点数字段 _score 来表示 。 _score 的评分越高,相关性越高。
查询语句会为每个文档生成一个 _score 字段。评分的计算方式取决于查询类型 不同的查询语句用于不同的目的: fuzzy 查询会计算与关键词的拼写相似程度,terms 查询会计算 找到的内容与关键词组成部分匹配的百分比,但是通常 relevance 是用来计算全文本字段的值相对于全文本检索词相似程度的算法。
Elasticsearch 的相似度算法被定义为检索词频率/反向文档频率, TF/IDF ,包括以下内容:
- 检索词频率
检索词在该字段出现的频率?出现频率越高,相关性也越高。 字段中出现过 5 次要比只出现过 1 次的相关性高。
- 反向文档频率
每个检索词在索引中出现的频率?频率越高,相关性越低。检索词出现在多数文档中会比出现在少数文档中的权重更低。
- 字段长度准则
字段的长度是多少?长度越长,相关性越低。 检索词出现在一个短的 title 要比同样的词出现在一个长的 content 字段权重更大。
相关性并不只是全文本检索的专利。也适用于 yes|no 的子句,匹配的子句越多,相关性评分越高。
如果多条查询子句被合并为一条复合查询语句,比如 bool 查询,则每个查询子句计算得出的评分会被合并到总的相关性评分中。
相关性算法
ES 5.0 之前,默认的相关性算分采用的是 TF-IDF,而之后则默认采用 BM25。
1)TF-IDF算法
TF-IDF 是ES5.0之前使用的,相关性算法。考虑词频,逆文档率,和词的长度影响。综合得到一个分数。
- TF 是词频,比如某个关键词在文章A中出现了10次,在文章B中出现了20次。理想情况下,出现的次数越多。相关性就越大一点。实际计算是,对关键词在文章中出现的次数开平方。
- IDF 是逆文档率。关键词在越多的文章中出现,该词的得分影响就越小。比如你我他这种关键词,可能在每篇文章中都出现了。那么实际上对文档的得分没有什么意义。
- 字段长度影响。例如,“联合利剑”在标题字段出现了,在正文也出现了。理想情况下,命中标题,相关性可能会更大一些。标题和正文,一般区别就是,标题比正文短很多。在评分中,字段的长度也会作为相关性分数中的一项去计算。
TF-IDF算法的思想就是,关键词在给定文档中出现的次数越高、全体文档中出现的次数越低时,该关键词在给定文档的评分就越高:
- 局部常见:该单词在文档中多次出现
- 全局罕见:该单词在语料库中出现的次数并不多
2)BM25算法
是在TF-IDF之上的补充,TF-IDF的缺陷:
- 未考虑词频饱和度(词频上限问题):词频饱和度指的是当词频超过一定数量之后,它对相关度的影响将趋于饱和。换句话说,词频10次的相关度比词频1次的分值要大很多,但100次与10次之间差距就不会那么明显了
- 未考虑文档长度影响(字段长短问题):1000个词的文档含有10个关键词,比10个词的文档含有1个词,相似度并不一定更高,因为文档越长所含的关键字也会更多
ES的应用
ES中相关性评分的应用很广泛,最常见的应用就是搜索引擎中,将最相关的链接展示在最前面,其次还有一些应用:
- 推荐系统中的用户最爱:每个用户的喜好不一致,对喜好字段设置更高权重,由ES打分并推荐最相关商品文档
- 风控系统中的团伙挖掘:对团伙各相关字段(手机号相同、地址相同等)设置权重,并由ES打分获取最相关的团伙文档
- 实时日志检索:基于ELK架构,以关键字作为评分依据,搜索最相关日志文档