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

问题描述

我正在使用Microsoft.Azure.Search SDK来运行包含同义词扩展名的Azure Cognitive Services搜索。我的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" };

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

  • 如果我搜索“狗”,它将返回Animal为“狗”,“猫”或“兔子”的任何Name
  • 如果我搜索dob”,它将与“ dog”模糊匹配,并返回Animal为“ dog”,“ cat”或“ rabbit”的Name,因为它们都是同义词为“狗”

我的搜索方法如下:

 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”时,它会正确返回以dog / cat / rabbit为名称的任何结果。但是当我搜索dob”时,它仅返回“ dog”的所有匹配项,而不返回任何同义词。

This answer from January 2019指出“同义词扩展名不适用于通配搜索词;前缀,模糊和正则表达式词不扩展。”但是此答案是一年多以前发布的,此后情况可能有所改变。

是否可以同时进行模糊匹配,然后在Azure认知搜索中对同义词进行匹配,或者是否有解决方法来实现这一目标?

解决方法

@spaceplane

同义词扩展名不适用于通配符搜索词;前缀,模糊和正则表达式项不会扩展

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

将获得的单词/图形直接传递给索引(根据此doc)。

话虽如此,我在想两个可能满足您要求的选择:

选项1

具有本地模糊匹配器。您可以在其中获得键入单词的可能匹配单词。

分享我发现的参考:Link 1。我确实遇到了很多完成类似任务的软件包。

现在,从获取的单词中,您可以建立 OR 查询,将所有匹配的单词绑定在一起,并将其发布到Azure认知搜索。

因此,在一个实例中:当dob〜被触发时-假设“点,狗”是模糊逻辑代码生成的单词。

我们使用这两个词,然后向Azure发出“狗或点”查询。反过来,由于搜索词“ dog”,同义词将有效,并且将根据同义词映射表相应地检索结果。

选项2

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