我了解Azure搜索使用TF-IDF算法排名和得分。不幸的是,这导致了我们如何返回结果的问题,到目前为止,自定义评分配置文件调整对我们没有帮助。
以下是问题的一个示例:
为简单起见,假设我们的搜索文档只有两个字段 - IndividualName和EntityName。由于我们的源数据点配置如何许多我们的记录/文档(并非所有)在这两个字段中都有重复数据。这对于我们的架构如何建立是不可避免的。
现在让我们说我们搜索约翰安德森。这是查询字符串:
searchMode=Any&search=+(%22John Anderson%22~3)&searchFields=IndividualName,EntityName&queryType=Full&$top=50&$count=true
假设我们在结果中有两个文档 - 一个在两个个人名和实体名字段中有“理查德约翰安德森”,第二个结果有约翰安德森,但只在个人名称字段中。 EntityName字段为空。问题在于Richard John Anderson文档得分/排名高于John Anderson文档。我只能推测这是由于TF-IDF算法,并且它将Richard John Anderson排名更高,因为它在文档中看到了两次。
你可以想象,这对我们没有意义。我们必须能够将John Anderson文档作为排名最高的文档,因为这是搜索到的名称,而不是Richard John Anderson。
我们尝试将此作为查询以查看它是否会有所帮助,但它不会:
search=+((IndividualName:"John Anderson" || EntityName:"John Anderson")^10 || (IndividualName:"John Anderson"~3 || EntityName:"John Anderson"~3))&searchFields=IndividualName,EntityName&queryType=Full
这就是为什么线程的主题行询问我们如何为我们的文档规避或减轻TF-IDF的权重。对我们来说,完全匹配比术语频率更重要。不允许将EntityName字段保留在查询之外。我们已经尝试了一些自定义得分和场地提升,但到目前为止,无济于事。希望MS Azure搜索团队可以在这里提供帮助。
答案 0 :(得分:1)
在您的示例中,两个文档都包含您要查找的确切短语" John Anderson"。搜索引擎在符合该短语的文档中得分更高,这是设计的。
如果您希望短语与字段的整个内容相匹配,最好的方法是将indexAnalyzer
设置为keyword
。
要了解有关搜索查询处理的更多信息,请参阅:How full text search works in Azure Search