Skip to main content

了解相似性和评分

分类:  Azure搜索 标签:  #Azure #Search #认知搜索 发布于: 2023-06-12 20:11:31

微软的文档永远都是言简意赅,博大精深,如果不认真不仔细看,经常就会有很多非常重要的提示或者技巧一晃而过,所以微软的文档是需要认真仔细的多读几遍才能够彻底的掌握清楚。

我们今天来学习相似性和评分。

开始之前我们回忆和熟悉几个名词:

  • SearchModel: 搜索模式,这个之前已经有介绍了,使用这个参数表示在搜索的时候部分匹配搜索词还是全部匹配搜索词(值:any,full)
  • 字词频率:是指某个词在被搜索的文章中出现的频率(次数)
  • 逆向文档频率:是一个词普遍重要性的度量值,它的大小和一个词的常见程度成反比。

关于字词频率-逆向文档频率的详细解释和计算公式,您可以百度一下,有不少不错的说明。例如:https://www.elastic.co/guide/cn/elasticsearch/guide/current/scoring-theory.html#:~:text=逆向文档频率的计算公式如下: idf (t) %3D 1 %2B log (numDocs,(docFreq %2B 1)) 词 t 的逆向文档频率( idf )是:索引中文档数量除以所有包含该词的文档数,然后求其对数。

相似性排名算法

Azure认知服务支持两种相似性排名算法:

  • ClassicSimilarity: 搜索结果中用字段@search.score表示值,2020年7月之后所有的搜索服务中使用。
  • BM25Similarity: 搜索结果中用字段@search.score表示值,2021年7月15号之后创建的搜索服务可以使用,之前创建的服务可以选择加入该算法。

这个两个算法都是类似于TF-IDF的检索函数,同样也是使用字词频率和逆向文档频率作为变量来计算每个文档查询的相关性分数,然后用于排名。

关于ClassicSimilarityBM25Similarity两种算法的差异以及背后的技术原理,大家可以自行寻找相应的文档来学习。

相关性评分

相关性评分是指针对全文搜索的结果中返回的每个项的评分。 该分数指示某一项在当前查询上下文中的相关性。 分数越高,项的相关度就越高。 在搜索结果中,根据为每项计算的搜索分数,按从高到低的顺序排列各项。 对于每个文档,分数将在响应中以“@search.score”的形式返回。

默认情况下会在响应中返回前 50 个结果,但你可以使用 $top参数返回更少或更多的项(单个响应中最多可以包含 1000 个项),并可以使用 $skip 获取下一个结果集。

根据数据和查询的统计属性计算搜索分数。 Azure 认知搜索会查找与搜索词匹配的文档(与部分搜索词或全部搜索词匹配,具体取决于 searchMode),并优先列出包含该搜索词多个实例的文档。 如果搜索词在数据索引中很少见,但在文档中很常见,搜索分数仍升至更高。 这种计算相关性的方法的基本原理称为 TF-IDF(字词频率-逆向文档频率)。

搜索分数值可以在整个结果集中重复。 当多个命中具有相同的搜索评分时,相同评分项的顺序就不会是明确和稳定的。 再次运行查询,你可能会看到项偏移位置,尤其是使用免费服务或包含多个副本的可计费服务时。 对于具有相同分数的两项,无法保证先显示哪一个。

如果要打破重复评分之间的平局,可以添加一个 $orderby子句以便先按评分排序,然后按另一个可排序字段(例如 $orderby=search.score() desc,Rating desc)排序。 有关详细信息,请参阅 $orderby

备注
@search.score = 1.00 表示未评分或未排名的结果集。 如果查询形式是模糊搜索、通配符或正则表达式查询,或者采用了 $filter 表达式,则会出现未评分的结果。

相关性评分统计信息和粘滞会话

为了实现可伸缩性,Azure认知服务通过将索引分片存储,这意味着索引在物理上是独立的。

默认情况下,文档的评分是根据分片中数据的统计属性计算的。 此方法对于大型数据集而言通常不会造成问题,与基于所有分片中的信息计算评分相比,此方法可提供更好的性能。 也就是说,使用这种性能优化可能会导致两个非常相似的文档(甚至相同的文档)最终可能出现不同的相关性评分(如果这些文档出现在不同的分片中)。

如果你偏向于基于所有分片中的统计属性计算评分,可以添加 scoringStatistics=global 作为查询参数(或者添加 "scoringStatistics""global" 作为查询请求的正文参数)来执行此操作。

GET https://[service name].search.windows.net/indexes/[index name]/docs?scoringStatistics=global&api-version=2020-06-30&search=[search term]
  Content-Type: application/json
  api-key: [admin or query key]

使用 scoringStatistics 可确保同一副本中的所有分片提供相同的结果。 也就是说,不同的副本相互之间可能略有不同,因为它们始终会随着索引的最新更改而更新。 在某些情况下,你可能希望用户在“查询会话”期间获得更一致的结果。 在这种情况下,可以提供 sessionId 作为查询的一部分。 sessionId 是你创建的用于引用唯一用户会话的唯一字符串。

GET https://[service name].search.windows.net/indexes/[index name]/docs?sessionId=[string]&api-version=2020-06-30&search=[search term]
  Content-Type: application/json
  api-key: [admin or query key]

只要使用相同的sessionid, 就会以同一副本为目标,让用户看的搜索结果总是一致的。

注意
反复使用相同的 sessionId 值可能会干扰跨副本对请求进行负载均衡,并对搜索服务的性能产生负面影响。 用作 sessionId 的值不能以“_”字符开头。

为配置文件评分

可以通过定义“计分概要文件”来自定义不同字段的排名方式。 借助计分概要文件,可以更好地控制搜索结果中的项排名。 例如,建议根据创收能力提升项、提升新项或提升库存时间太长的项。

计分概要文件属于索引定义的一部分,由加权字段、函数和参数组成。 有关定义计分概要文件的详细信息,我们后面再学习,这里先留一个映像。