0

我的 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" 
}

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

4

1 回答 1

4

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

在您的情况下,预计搜索“peacock*”不会匹配仅包含术语“teampeacock”的文档,因为术语“team”和“peacock”之间没有分隔符。这意味着您的索引中只会创建 1 个令牌(“teampeacock”)。由于您在搜索查询(“peacock*”)中的“peacock”末尾使用了通配符,因此将匹配以“peacock”开头的标记,但不会匹配以“teampeacock”开头的标记。

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

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

编辑:只是作为警告添加,如果性能是一个问题,您应该知道以这种方式使用通配符是低效的,因为您最终将通过大量索引来查找匹配项。进行前缀和后缀搜索的一种更有效的方法是在索引时使用 edgeNGram 标记器来创建表示单词开头或结尾的各种标记。有关更多详细信息,您可以查看自定义分析器文档:https ://docs.microsoft.com/en-us/azure/search/index-add-custom-analyzers

于 2019-06-17T18:26:34.483 回答