带通配符或模糊搜索的Azure完全搜索未返回预期结果

时间:2019-06-17 12:57:52

标签: azure-search azure-search-.net-sdk

我的Azure搜索索引中有以下记录

{ 
    "customerId": "8feda7ca-c9f0-40d9-86d8-434b0bbe94c2", 
    "registeredName": "TeamPeacock", 
    "tradingName": "TeamPeacock", 
}, 
{ 
    "customerId": "b445eb04-8d07-4708-a197-770cda3a459e", 
    "registeredName": "TeamPeacock1", 
    "tradingName": "TeamPeacock 1", 
}

我正在使用带有通配符/模糊搜索的完全搜索来获取记录。

以下搜索查询无法获取以上记录:

查询1失败:

{ 
    "search": "(peacock*) OR (peacock*~) OR (peacock~)", 
    "queryType": "full", 
    "searchMode": "all" 
}

查询2失败:

{ 
    "search": "(peacock*) OR (peacock*~) OR (peacock~)", 
    "queryType": "full", 
    "searchMode": "any" 
}

查询3失败:

{ 
    "search": "(peacock*)", 
    "queryType": "full", 
    "searchMode": "any" 
}

查询4失败:

{ 
    "search": "(peacock*~) OR (peacock~)", 
    "queryType": "full", 
    "searchMode": "any" 
}

但是,如果我包含“ teampeacock”一词,则搜索查询将返回结果。

通过的查询:

{ 
    "search": "(teampeacock*) OR (peacock*~) OR (peacock~)", 
    "queryType": "full", 
    "searchMode": "all" 
}

通过的查询:

{ 
    "search": "(teampeacock*~) OR (peacock~)", 
    "queryType": "full", 
    "searchMode": "any" 
}

为什么用“孔雀”一词进行搜索不会返回数据?

1 个答案:

答案 0 :(得分:2)

您可以使用分析API来了解Azure搜索如何根据文本创建令牌: https://docs.microsoft.com/en-us/rest/api/searchservice/test-analyzer

在您的情况下,由于“ team”和“ peacock”之间没有定界符,因此预期搜索“ peacock *”将与仅包含“ teampeacock”一词的文档不匹配。这意味着将在您的索引中仅创建1个令牌(“ teampeacock”)。由于您在搜索查询中的“孔雀”(“ peacock *”)的末尾使用了通配符,因此将匹配以“孔雀”开头的令牌,但不会匹配以“ teampeacock”开头的令牌。

如果要匹配包含“孔雀”的任何内容,可以通过以下查询将其用作“中缀”而不是“前缀”:

{ 
    "search": "/.*peacock.*/", 
    "queryType": "full",
    "searchMode":"all"
}

edit:只是作为警告,如果您需要关注性能,您应该知道以这种方式使用通配符效率低下,因为最终您将要遍历大量索引来查找匹配的术语。进行前缀和后缀搜索的一种更有效的方法是在索引编制时使用edgeNGram令牌生成器来创建表示单词开头或结尾的各种令牌。有关更多详细信息,请查看自定义分析器文档:https://docs.microsoft.com/en-us/azure/search/index-add-custom-analyzers