本文介绍如何配置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 排名提供两个参数以优化相关性分数计算。
使用创建或更新索引请求设置 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 } }如果索引是实时的,请在请求上追加
allowIndexDowntime=trueURI 参数,如上一示例所示。由于Azure AI Search不允许更新实时索引,因此需要使索引脱机,以便可以添加参数。 索引和查询请求在索引处于脱机状态时失败。 中断持续时间是更新索引所需的时间,通常不超过几秒钟。 更新完成后,索引会自动恢复。
将
"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。
在索引存在并具有“相似性”属性后,可以在BM25Similarity和ClassicSimilarity之间切换。
以下链接描述了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"
}
}