搜索相关性详解

什么是相关性(Relevance)

搜索是用户和搜索引擎的对话,用户关心的是搜索结果的相关性

  • 是否可以找到所有相关的内容
  • 有多少不相关的内容被返回了
  • 文档的打分是否合理
  • 结合业务需求,平衡结果排名

相关性是指在搜索引擎中,描述一个文档与查询语句匹配程度的度量标准。这种相关性通过为每个匹配查询条件的文档计算一个相关性评分(_score)来实现,评分越高表示文档与查询语句的匹配程度越高

如下例子:显而易见,查询JAVA多线程设计模式,文档id为2,3的文档的算分更高

关键词

文档ID

JAVA

1,2,3

设计模式

1,2,3,4,5,6

多线程

2,3,7,9

Elasticsearch使用评分算法,根据查询条件与索引文档的匹配程度来确定每个文档的相关性。同时,为了满足各种特定的业务需求,Elasticsearch也充分允许用户自定义评分。

在下面示例中,_score就是Elasticsearch检索返回的评分,其值可以衡量每个文档与查询的匹配程度,即相关性。每个文档都有对应的评分,该得分由正浮点数表示。文档评分越高,则该文档的相关性越高。

计算相关性评分

Elasticsearch使用布尔模型查找匹配文档,并用一个名为“实用评分函数”的公式来计算相关性。这个公式借鉴了TF-IDF(词频-逆向文档频率)和向量空间模型,同时加入了一些现代的新特性,如协调因子、字段长度归一化以及词/查询语句权重提升。

Elasticsearch 5之前的版本,评分机制或者打分模型是基于TF-IDF实现的。从Elasticsearch 5之后,默认的打分机制改成了Okapi BM25。其中BM是Best Match的缩写,25是指经过25次迭代调整之后得出的算法,它是由TF-IDF机制进化来的。

传统TF-IDF和BM25都使用逆向文档频率来区分普通词(不重要)和非普通词(重要)​,使用词频来衡量某个词在文档中出现的频率。两种机制的逻辑相似:首先,文档里的某个词出现得越频繁,文档与这个词就越相关,得分越高;其次,某个词在集合中所有文档里出现的频次越高,则它的权重越低、得分越低。也就是说,某个词在集合中所有文档里越罕见,其得分越高。BM25在传统TF-IDF的基础上增加了几个可调节的参数,使得它在应用上更佳灵活和强大,具有较高的实用性。

TF-IDF评分公式:

  • TF是词频(Term Frequency)

检索词在文档中出现的频率越高,相关性也越高。

词频(TF) = 某个词在文档中出现的次数 / 文档的总词数

  • IDF是逆向文本频率(Inverse Document Frequency)

每个检索词在索引中出现的频率,频率越高,相关性越低。总文档中有些词比如“是”、“的” 、“在” 在所有文档中出现频率都很高,并不重要,可以减少多个文档中都频繁出现的词的权重。

逆向文本频率(IDF)= log (语料库的文档总数 / (包含该词的文档数+1))

  • 字段长度归一值( field-length norm)

检索词出现在一个内容短的 title 要比同样的词出现在一个内容长的 content 字段权重更大。

以上三个因素——词频(term frequency)、逆向文本频率(inverse document frequency)和字段长度归一值(field-length norm)——是在索引时计算并存储的,最后将它们结合在一起计算单个词在特定文档中的权重。

BM25 就是对 TF-IDF 算法的改进,对于 TF-IDF 算法,TF(t) 部分的值越大,整个公式返回的值就会越大。BM25 就针对这点进行来优化,随着TF(t) 的逐步加大,该算法的返回值会趋于一个数值。

  • BM 25的公式

示例:通过Explain API查看TF-IDF

Elasticsearch自定义评分

自定义评分是用来优化Elasticsearch默认评分算法的一种有效方法,可以更好地满足特定应用场景的需求。

自定义评分的核心是通过修改评分来修改文档相关性,在最前面的位置返回用户最期望的结果。

Elasticsearch自定义评分的主要作用如下:

1) 排序偏好:通过在搜索结果中给每个文档自定义评分,可以更好地满足搜索用户的排序偏好。

2) 特殊字段权重:通过给特定字段赋予更高的权重,可以让这些字段对搜索结果的影响更大。

3) 业务逻辑需求:根据业务需求,可以定义复杂的评分逻辑,使搜索结果更符合业务需求。

4) 自定义用户行为:可以使用用户行为数据(如点击率)作为评分因素,提高用户搜索体验。

搜索结果相关性与自定义评分的关系

搜索引擎本质是一个匹配过程,即从海量的数据中找到匹配用户需求的内容。判定内容与用户查询的相关性一直是搜索引擎领域的核心研究课题之一。如果搜索引擎不能准确地识别用户查询的意图并将相关结果排在前面的位置,那么搜索结果就不能满足用户的需求,从而影响用户对搜索引擎的满意度。

自定义评分的策略

然而,如何实现这样的自定义评分策略,以确保搜索结果能够最大限度地满足用户需求呢?我们可以从多个层面,包括索引层面、查询层面以及后处理阶段着手。

以下是几种主要的自定义评分策略:

  • Index Boost: 在索引层面修改相关性
  • boosting: 修改文档相关性
  • negative_boost: 降低相关性
  • function_score: 自定义评分
  • rescore_query:查询后二次打分

Index Boost: 在索引层面修改相关性

Index Boost这种方式能在跨多个索引搜索时为每个索引配置不同的级别。所以它适用于索引级别调整评分。

实战举例:一批数据里有不同的标签,数据结构一致,要将不同的标签存储到不同的索引(A、B、C),并严格按照标签来分类展示(先展示A类,然后展示B类,最后展示C类)​,应该用什么方式查询呢?

具体实现如下。借助indices_boost提升索引的权重,让A排在最前,其次是B,最后是C。

PUT /my_index_100b/_doc/1
{
    "subject":"subject 1"
}

PUT /my_index_100c/_doc/1
{
    "subject":"subject 1"
}

GET /my_index_100*/_search
{
    "query": {
        "term": {
          "subject.keyword": {
            "value": "subject 1"
          }
        }
    },
    "indices_boost": [
      {
        "my_index_100a": 1.5
      },
       {
        "my_index_100b": 1.2
      },
       {
        "my_index_100c": 1
      }

    ]
}

boosting: 修改文档相关性

boosting可在查询时修改文档的相关度。boost

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值