将模糊搜索与 Azure 搜索中的同义词扩展相结合

Combining fuzzy search with synonym expansion in Azure search

我正在使用 Microsoft.Azure.Search SDK 运行 包含同义词扩展的 Azure 认知服务搜索。我的SynonymMap如下:

private async Task UploadSynonyms()
{
     var synonymMap = new SynonymMap()
     {
           Name = "desc-synonymmap",
           Synonyms = "\"dog\",  \"cat\", \"rabbit\"\n "
     };

     await m_SearchServiceClient.SynonymMaps.CreateOrUpdateAsync(synonymMap);
}

这映射到 Animal.Name 如下:

  index.Fields.First(f => f.Name == nameof(Animal.Name)).SynonymMaps = new[] { "desc-synonymmap" };

我正在尝试同时使用模糊匹配和同义词匹配,例如:

我的搜索方法如下:

 private async Task RunSearch()
 {          
    var parameters = new SearchParameters
    {
        SearchFields = new[] { nameof(Animal.Name) },
        QueryType = QueryType.Full
    };

    var results = await m_IndexClientForQueries.Documents.SearchAsync<Animal>("dog OR dog~", parameters);
 }

当我搜索 'dog' 时,它正确地 returns 任何名称为 dog/cat/rabbit 的结果。但是,当我搜索 'dob' 时,它只会 returns 匹配 'dog',而不是任何同义词。

声明“同义词扩展不适用于通配符搜索字词;前缀、模糊和正则表达式字词不会扩展。”但这个答案是一年多前发布的,从那以后情况可能发生了变化。

是否可以在 Azure 认知搜索中对同义词进行模糊匹配然后匹配,或者是否有任何解决方法可以实现此目的?

@spaceplane

同义词扩展不适用于通配符搜索词;前缀、模糊和正则表达式术语未展开

不幸的是,这仍然适用。 参考 : https://docs.microsoft.com/en-us/azure/search/search-synonyms

原因是获得的 words/graphs 直接传递给索引(根据此 doc)。

话虽如此,我正在考虑两个可能满足您要求的选项:

选项 1

有一个本地模糊匹配器。在哪里可以获得输入的单词可能的匹配词。

分享我找到的参考资料:Link 1。我确实遇到了很多执行类似任务的软件包。

现在,您可以根据获得的单词构建 查询绑定所有匹配的单词并将其发送到 Azure 认知搜索。

举个例子:当 dob~ 被触发时 - 假设“dot,dog”是模糊逻辑代码生成的单词。

我们使用这两个词,随后向 Azure 发出“dog or dot”查询。同义词会因搜索词“狗”而依次生效,结果将根据同义词映射进行相应检索。

选项 2

您可以考虑使用同义词映射来处理。例如,将“dog”映射为“dob、dgo、dot”以及其他同义词。