第五章 ES相关性检索与组合查询

您所在的位置:网站首页 全文检索包括哪些类型 第五章 ES相关性检索与组合查询

第五章 ES相关性检索与组合查询

2024-07-05 08:39| 来源: 网络整理| 查看: 265

一、相关性检索和组合查询概念

 

在全文检索中,检索结果与查询条件的相关性是一个极为重要的问题,优秀的全文检索引擎应该将那些与查询条件相关性高的文档排在最前面。想象一下。如果满足查询条件的文档成千上万,让用户在这些文档中再找出自己最满意的那一条,这无异于再做一次人工检索。用户一般很少会有耐心在检索结果中翻到第3页,所以处理好检索结果的相关性对于检索引擎来说至关重要。

Google公司就是因为发明了Page Rank算法,巧妙地解决了网页检索结果的相关性问题,才在众多搜索公司中迅速崛起。相关性问题有两方面问题要解决,一是如何评价单个查询条件的相关性,二是如何将多个查询条件的相关性组合起来。 

1、什么是相关性评分?

全文检索与数据库查询的一个显著区别,就是它并不一定会根据查询条件做完全精确的匹配。除了模糊查询以外,全文检索还会根据查询条件给文档的相关性打分并排序,将那些与查询条件相关性高的文档排在最前面。相关性( Relevance)或相似性(Similarity)是指两个事物间相互关联的程度,在检索领特指检索请求与检索结果之间的相关程度。在 Elaticsearch返回的每条结果中都会包含一个_score字段,这个字段的值就是当前文档匹配检索请求的相关性评分,我们也可以称为相关度。

解决相关性问题的核心是计算相关度的算法和模型,相关度算法和模型是全文检索文章最重要的技术之一。相关度算法和相关度模型并非完全相同的概念,相关度模型可以认为是具有相同理论基础的算法集合。所以在实际应用时都是指定到具体的相关度算法,相关度模型则是从理论层面对相关度算法的归类。

2、相关度模型

Elasticsearch支持多种相关度算法,它们通过类型名称来标识,包括boolean、BM25、DFR等等很多。这些算法分别归属于几种不同的理论模型,它们是布尔模型、向量空间模型、概率模型、语言模型等。

2.1、布尔模型

布尔模型( Boolean Model)是最简单的相关度模型,最终的相关度只有1或0两种。如果检索中包含多个查询条件,则查询条件之间的相关度组合方式取决它们之间的逻辑运算符,即以逻辑运算中的与、或、非组合评分。文档的最终评分为1时会被添加到检索结果中,而评分为0时则不会出现在检索结果中。这与使用SQL语句查询数据库有些类似,完全根据查询条件决定结果,非此即彼。在Elasticearch支持的相关度算法中,boolean算法即采用布尔模型,有些地方也部分地采用了布尔模型。

2.2、向量空间模型

向量空间模型(Vector Space Mode)组合多个相关度时采用的是基于向量的算法。在向量空间模型中,多个查询条件的相关度以向量的形式表示。向量实际上就是包含多个数的一维数组,例如[1,2, 3,4, 5, 6]就是一个6维向量,其中每个数字都代表一个查询条件的相关度。文档对于n个查询条件会形成一个n维的向量空间,如果定义1个查询条件最佳匹配的n维向量,那么与这个向量越接近则相关度越高。从向量的角度来看,就是两个向量之间的夹角越小相关度越高,所以n个相关度的组合就转换为向量之间夹角的计算。

简单理解,可以只考虑一个二维向量,也就是查询条件只有两个,这样就可以将两个相关度映射到二维坐标图的X轴和Y轴上。假设两个查询条件权重相同,那么最佳匹配值就可以设置为[1, 1]。如果某文档匹配了第一个条件,部分地匹配了第二个条件,则该文档的向量值为[1, 0.2]。将这两个向量绘制在二维坐标图中,就得到了它们的夹角。

对于多维向量来说,线性代数提供了余弦近似度算法,专门用于计算两个多维向量的夹角。

注:余弦相似性通过测量两个向量的夹角的余弦值来度量它们之间的相似性。0度角的余弦值是1,而其他任何角度的余弦值都不大于1;并且其最小值是-1。从而两个向量之间的角度的余弦值确定两个向量是否大致指向相同的方向。两个向量有相同的指向时,余弦相似度的值为1;两个向量夹角为90°时,余弦相似度的值为0;两个向量指向完全相反的方向时,余弦相似度的值为-1。这结果是与向量的长度无关的,仅仅与向量的指向方向相关。余弦相似度通常用于正空间,因此给出的值为-1到1之间。

注意这上下界对任何维度的向量空间中都适用,而且余弦相似性最常用于高维正空间。例如在信息检索中,每个词项被赋予不同的维度,而一个维度由一个向量表示,其各个维度上的值对应于该词项在文档中出现的频率。余弦相似度因此可以给出两篇文档在其主题方面的相似度。

2.3、概率模型

概率模型是基于概率论构建的模型,BM25、DFR、DFI都属于概率模型中的一种实现算法,背后有着非常严谨的概率理论依据。以其中最为流行的BM25为例,它背后的概率理论是贝叶斯定理,而这个定理在许多领城中都有广泛的应用。

BM25法将检索出来的文档(D)分为相关文档(R)和不相关文档(NR)两类,使用P(R|D)代表文档属于相关文档的概率,而使用P(NR|D)表示文档属于不相关文档的概率,则当P(R|D)>P(NR|D)时认为这个文档与用户查询相关。根据贝叶斯公式将P(R|D)>P(NR|D)转换为对某个比值的计算。在此基础上再进行一此转换,就可以得到不同的相关度算法。

2.4、语言模型

语言模型最早并不是应用于全文检索领域,而是应用于语音识别、机器翻译、拼写检查等领域。在全文检索中,语言模型为每个文档建立不同的计算模型,用以判断由文档生成某一查询条件的概率是多少,而这个概率的值就可以认为是相关度。可见,语言模型与其他检索模型正好相反,其他检索模型都是从查询条件查找满足条件的文档,而语言模型则是根据文档推断可能的查询条件。

3、TF/IDF

对于一篇几百字几千字的文章,如何生成足以准确表示该文章的特征向量呢?就像论文一样,摘要、关键词毫无疑问就是全篇最核心的内容,因此,我们要设法提取一篇文档的关键词,并对每个关键词计算其对应的特征权值,从而形成特征向量。这里涉及一个非常简单但又相当强大的算法,即TF-IDF算法。

TF/IDF实际上两个影响相关度的因素,即TF和IDF。其中TF是词项频率简称词频,指一个词项在当前文档中出现的次数,而IDF则是逆向文档频率,指词项在所有文档中出现的次数。

Elasticsearch提供的几种算法中都或多或少有TF/IDF的思想,例如BM25算法虽然是通过概率论推导而来,但最终的计算公式与TF/IDF在本质上也是一致的。TF/IDF算法的核心思想是TF越高则相关度越高,而IDF越高相关度越低。TF对相关度的影响比较容易理解,但IDF为什么会在词项出现次数多的时候反而相关度低呢?

举例来说,如果使用"elasticsearch全文检索"两个词项做检索,文档中“elasticsearch"出现次数高的文档比“全文检索”出现次数高的文档相关度要高。这是因为“elasticsearch "是专业性比较强的词汇,更加专有,它在其他文档中出现的次数会比较少,也就是IDF低,而“全文检索”虽然也是专业性词汇,但它覆盖的面要比“elasticsearch " 更广泛,所以它在其他文档中出现的次数会比较高,也就是IDF高。换句话说,介绍elasticsearch的文章大概率会提到全文检索。但介绍全文检索的文章则不一定会提到elasticsearch,比如一篇介绍MongoDB的文章大概率会提到全文检索,但是这样的文章与“elasticsearch全文检索”的相关度不高。

可见,在使用TF/IDF计算评分时必须要用到词项在文档中出现的频率,即词频。默认情况下文档text类型字段在编入索引时都会记录词频。Elasticsearch中的classic算法实际上是使用Lucene的实用评分函数(Practical Scoring Function),这个评分函数结合了布尔模型、TF/IDF和向量空间模型来共同计算分值。该算法是早期Elasticsearch运算相关度的算法,现在已经改为BM25了。

4、BM25

BM25是Best Match25的简写,由于最早应用于一个名为Okapi的系统中,所以很多文献中也称之为 Okapi BM25。BM25算法被认为是当今最先进的相关度算法之一,Elasticsearch文档字段的默认相关度算法就是采用BM25,它属于概率模型,依据贝叶斯公式,经过一系列的严格推导以后,得出了一个关于IDF的 公式。

 

同时在这个基础上,最终的公式上加入了对TF、当前文档的长度、词频饱和度、长度归一化等因素的考虑:

 

4.1、词频饱和度

所谓词频饱和度指的是当词频超过一定数量之后,它对相关度的影响将趋于饱和。换句话说,词频10次的相关度比词频1次的分值要大很多,但100次10次之间差距就不会那么明显了。在BM25算法中,控制词频饱和度的参数是k1,默认值为1.2。参数k1的值越小词频对相关度的影响就会越快趋于饱和,而值越大词频饱和度变化越慢。

举例来说,如果将k1设置为1,词频达到10时就会趋于饱和;而当k1设置为100时词频在100时才会趋于饱和。一般来说k1的取值范围为[1.2, 2.0]。

4.2、长度归一化

一般来说, 查询条件中的词项出现在较短的文本中,比出现在较长的文本中对结果的相关性影响更大。

举例来说,如果一篇文章的标题中包含elasticsearch,那么这篇文章是专门介绍elasticsearch的可能性比只在文章内容中出现elasticsearch的可能要高很多。但这种比较其实是建立在两个不同的字段上,而在实际检索时往往是针对相同的字段做比较。

比如在两篇文章的标题中都出现了elasticsearch,那么哪一篇文章的相关度更高呢?

BM25针对这种情况对文本长度做了所谓的归一化处理,即考虑当前文档字段的文本长度与所有文档的字段平均长度的比值,而这个比值就是长度归一化因素。

为了控制长度归一化对相关度的影响,在长度归一化中加了一个控制参数b。这个值的取值范围为[0.0, 1.0],取值0.0时会禁用归一化,而取值1.0则会完全启用归一化,默认值为0. 75。

5、相关度解释

相关度算法可通过text或keyword类型字段的similarity参数修改,也就是说相关度算法不针对整个文档而是针对单个字段,它的默认值是BM25。当然Elasticsearch相关度评分比这里介绍的内容要复杂得多,可以通过在查询时添加explain参数查看评分解释。例如:

POST /kibana_sample_data_logs/_search

{

  "query": {

    "match": {

      "message": "chrome"

    }

  },

  "explain": true

}

除此之外,通过_explain接口也可以实现类似的功能,不同的是_explain接口查看的是单个文档与检索条件的相关度评分解释。例如:

POST /kibana_sample_data_logs/_explain/5JOUVnMBNqF0Lmj_DG9M

{

  "query": {

    "match": {

      "message": "chrome"

    }

  }

}

我们可以大致了解下 Elasticsearch 是如何进行评分的:

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3