配置 BM25 相关性评分

在本文中,了解如何配置 Azure 认知搜索用于全文搜索查询的 BM25 相关性评分算法。 它还介绍了如何在较旧的搜索服务上启用 BM25。

BM25 适用于:

  • 对具有searchable归属的文本字段使用search参数进行全文搜索的查询。
  • 评分范围限定为searchFields;或为所有searchable字段(如果searchFields为 null)。

搜索引擎使用 BM25 计算给定查询中每个匹配项的@searchScore。 匹配的文档按搜索分数进行排名,并在查询响应中返回排名靠前的结果。 即使从对同一搜索索引执行的同一查询中,结果也可能会出现一些分数变化,但通常这些变化很小,不会改变结果的总体排名。

BM25 对词频和文档长度进行加权具有默认值。 如果默认值不适合你的内容,则可以自定义这些属性。 配置更改的范围限定为单个索引,这意味着可以根据每个索引的特征调整相关性评分。

默认评分算法

根据你的搜索服务的年限,Azure 认知搜索支持两种评分算法,用于全文搜索查询:

  • Okapi BM25 算法(2020 年 7 月 15 日后)
  • 经典相似度算法(2020 年 7 月 15 日前)

BM25 排名是默认算法,因为它往往能够生成更符合用户预期的搜索排名。 它包含用于根据文档大小之类的因素优化结果的参数。 对于 2020 年 7 月之后创建的搜索服务,BM25 是唯一的评分算法。 如果你尝试在新服务上将“相似性”算法设置为 ClassicSimilarity,会返回 HTTP 400 错误,因为服务不支持该算法。

对于较旧的服务,经典相似性仍然是默认算法。 旧服务可以按索引升级到 BM25。 从经典算法切换到 BM25 时,搜索结果的排序方式预期会出现一些差异。

设置 BM25 参数

BM25 排名提供两个参数以优化相关性分数计算。

  1. 使用创建或更新索引请求设置 BM25 参数:

    PUT [service-name].search.azure.cn/indexes/[index-name]?api-version=2020-06-30&allowIndexDowntime=true
    {
        "similarity": {
            "@odata.type": "#Microsoft.Azure.Search.BM25Similarity",
            "b" : 0.75,
            "k1" : 1.2
        }
    }
    
  2. 如果索引是实时的,请在请求上追加allowIndexDowntime=true URI 参数,如上一示例所示。

    由于认知搜索不允许更新实时索引,因此需要使索引脱机,以便可以添加参数。 索引和查询请求在索引处于脱机状态时失败。 中断持续时间是更新索引所需的时间,通常不超过几秒钟。 更新完成后,索引会自动恢复。

  3. "b""k1"设置为自定义值,然后发送请求。

    properties 类型 说明
    k1 数字 控制每个匹配字词的字词频率与文档-查询对的最终相关性分数之间的调整函数。 值通常为 0.0 到 3.0,默认值为 1.2。

    值为 0.0 表示“二进制模型”,其中单个匹配字词的贡献对所有匹配文档相同,无论该字词在文本中出现多少次。 更大的 k1 值允许分数继续增加,因为文档中可找到同一字词的更多实例。

    如果搜索查询中包含多个字词,则使用更大的 k1 值非常重要。 在这些情况下,可能希望选择匹配更多查询字词的文档,而不是仅多次匹配单个字词的文档。 例如,查询字词“阿波罗宇宙飞行”的文档时,面对一篇有关希腊神话的、几十次提到字词“阿波罗”但未提到“宇宙飞行”的文章,以及一篇明确提到了字词“阿波罗”和“宇宙飞行”,但只是提到了几次的文章,可能希望降低前一篇文章的评分。
    b 数字 控制文档长度如何影响相关性分数。 值介于 0 和 1 之间,默认值为 0.75。

    值为 0.0 表示文档的长度不会影响分数。 值为 1.0 表示词频对相关性分数的影响由文档的长度规范化。

    如果想要惩罚较长的文档,则按文档长度规范化词频很有用。 在一些情况下,与较短的文档相比,较长的文档(例如整篇小说)更有可能包含很多不相关的字词。

在旧服务上启用 BM25 评分

如果你运行的搜索服务是在 2014 年 3 月到 2020 年 7 月 15 日这段时间创建的,则可以通过在新索引上设置“similarity”属性来启用 BM25。 该属性仅在新索引上公开,因此,如果要在现有索引上启用 BM25,则必须删除该索引,然后在将“相似性”属性设置为Microsoft.Azure.Search.BM25Similarity的情况下重新生成索引

存在具有“similarity”属性的索引后,可以在 BM25SimilarityClassicSimilarity 之间进行切换。

以下链接介绍了 Azure SDK 中的 Similarity 属性。

客户端库 Similarity 属性
.NET SearchIndex.Similarity
Java SearchIndex.setSimilarity
JavaScript SearchIndex.Similarity
Python SearchIndex 上的 similarity 属性

REST 示例

你还可以使用 REST API。 以下示例会创建一个新索引,该索引的“similarity”属性设置为 BM25:

PUT [service-name].search.azure.cn/indexes/[index name]?api-version=2020-06-30
{
    "name": "indexName",
    "fields": [
        {
            "name": "id",
            "type": "Edm.String",
            "key": true
        },
        {
            "name": "name",
            "type": "Edm.String",
            "searchable": true,
            "analyzer": "en.lucene"
        },
        ...
    ],
    "similarity": {
        "@odata.type": "#Microsoft.Azure.Search.BM25Similarity"
    }
}

另请参阅