将模糊搜索与 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" };
我正在尝试同时使用模糊匹配和同义词匹配,例如:
- 如果我搜索 'dog' 它 returns 任何
Animal
Name
为 'dog'、'cat' 或 'rabbit'
- 如果我搜索 'dob',它会模糊匹配 'dog' 和 returns 任何
Animal
且 Name
为 'dog','cat' 或 'rabbit',因为它们都是 'dog' 的同义词
我的搜索方法如下:
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”以及其他同义词。
我正在使用 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" };
我正在尝试同时使用模糊匹配和同义词匹配,例如:
- 如果我搜索 'dog' 它 returns 任何
Animal
Name
为 'dog'、'cat' 或 'rabbit' - 如果我搜索 'dob',它会模糊匹配 'dog' 和 returns 任何
Animal
且Name
为 'dog','cat' 或 'rabbit',因为它们都是 'dog' 的同义词
我的搜索方法如下:
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”以及其他同义词。