在 cmets 中有一些关于使用通配符 * 进行 Like% 样式查询的好答案,但有时您可能也想做 %Like 查询。为此,您需要创建一个custom analyzer。
您需要这样做的原因是因为默认索引的工作方式是它索引单词的开头。例如,对于 Microsoft 一词,索引将在 M 上完成,然后是 Mi,然后是 Mic,等等......
这使得搜索 Mic% 变得容易,但它不适用于 %soft。所以为了让它工作,我们需要使用一些技巧,我们告诉分析器反转单词,然后索引这些词(你可以看到下面的分析器“suffixAnalyzer”的例子)。对于 Microsoft 的示例,它会对 t、tf、tfo、tfos 等进行索引...当然这不会起作用,因为我们希望能够搜索 %soft,但是索引会反转单词(即tofs 而不是软)。所以我们所做的就是拥有一个尊重它的分析器(您可以在下面查看分析器“revereseText”的示例)。
现在我们只需要一个新字段,它使用“suffixAnalyzer”作为索引,使用“revereseText”作为 searchAnalyzer(您可以在下面看到字段“suffixName”的示例)。
"fields": [
{ "name":"suffixName", "type":"Edm.String", "searchable":true, "searchAnalyzer":"reverseText", "indexAnalyzer":"suffixAnalyzer" }
]
"analyzers": [
{"name":"suffixAnalyzer","@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer","tokenizer":"standard","tokenFilters":[ "lowercase", "asciifolding", "reverse", "my_edgeNGram" ]},
{"name":"reverseText","@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer","tokenizer":"standard","tokenFilters":[ "lowercase", "reverse" ]}
]
获得所有这些信息后,您可以在 suffixName 字段中搜索“soft”,它会以非常快的查询速度找到它。
顺便说一句,您实际上可以使用以下分析器创建前缀分析器,这样您实际上就不必使用通配符。
"analyzers": [
{"name":"prefixAnalyzer","@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer","tokenizer":"standard","tokenFilters":[ "lowercase", "my_edgeNGram" ]}
]
"fields": [
{ "name":"partialName", "type":"Edm.String", "searchable":true, "searchAnalyzer":"standard", "indexAnalyzer":"prefixAnalyzer" },
]