Elasticsearch:什么是相关性
我们已经注意到,搜索结果会以相关性的倒序方式返回。但是什么是相关性,它又是如何被计算出来的呢?
每一份被搜索出来的文档都带有一个由正的浮点数来表示的相关性评分,被称为_score。这个分数越高,代表这份文档越相关。
查询子句会为每份文档生成一个评分_score。如何生成这个评分依赖于查询子句的类型。不同类型的查询子句用于不同的目的:模糊查询(fuzzy query)通过计算原始搜索单词与找到单词之间有多相似,来决定相关性评分。然而,我们平常说的相关性指的是那些我们用于计算全文字段与全文查询字符串之间有多相似的算法。
Elasticsearch标配的相似度算法(similarity algorithm)是著名的词频/反向文档频率(term frequency/inverse document frequency),或称为 TF/IDF算法。它将以下计算因子考虑在内:
词频(Term frequency)
指查询语句中的词在某个字段中出现有多频繁?越频繁,越相关。如果这个字段包含了5个查询语句提及到的词,这份文档的相关性当然大于只包含1个的。
反向文档频率(Inverse document frequency)
指查询语句中的词在索引中出现有多频繁?越频繁,越不相关。在很多文档里都出现的词的权重比起那些更不经常出现的更低。
词长基准(Field-length norm)
指这个字段有多长。越长,越不相关。一个词出现在短的title字段中比相同的词出现在长内容的content字段具有更大的权重。
当然,在某些查询语句中会将TF/IDF评分与其它评分因子结合起来使用,如短语查询(phrase query)的词接近度(term proximity)或模糊查询中的词相似度。
然而,相关性不只是用于全文搜索。它同样可以被应用于yes/no的查询子句。文档匹配到的子句越多,评分_score就越高。
当使用组合查询(compound query)——如bool查询——来组合多个查询子句时,各个查询子句的评分被组合起来共同计算出这个文档的评分。
小结
实际上, 在信息检索领域,跳过 索引这个概念直接说 相关性是不合理的。所以,当这篇文章对于不少人应该是不好理解的。但是没关系。下次我们聊聊 什么是索引。