共用方式為

配置 BM25 相关性评分

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

BM25 适用于:

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

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

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

默认评分算法

根据搜索服务的年龄,Azure AI Search支持全文搜索查询的两种评分算法

  • 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=2025-09-01&allowIndexDowntime=true
    {
        "similarity": {
            "@odata.type": "#Microsoft.Azure.Search.BM25Similarity",
            "b" : 0.75,
            "k1" : 1.2
        }
    }
    
  2. 如果索引是实时的,请在请求上追加allowIndexDowntime=true URI 参数,如上一示例所示。

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

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

    属性 类型 说明
    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

在索引存在并具有“相似性”属性后,可以在BM25SimilarityClassicSimilarity之间切换。

以下链接描述了Azure SDKs中的 Similarity 属性。

客户端库 相似性属性
.NET SearchIndex.Similarity
Java SearchIndex.setSimilarity
JavaScript SearchIndex.Similarity
Python 在 SearchIndex 中的相似度属性

REST 示例

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

PUT [service-name].search.azure.cn/indexes/[index name]?api-version=2025-09-01
{
    "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"
    }
}

另请参阅