如何在 Azure 搜索索引中获取字符匹配而不是子字符串
How to get character matches in Azure Search index instead of substrings
我为 DocumentDB
collection 创建了一个 Azure 索引,它似乎工作正常。该索引具有用户帐户的属性,例如 FirstName
、LastName
和 Username
。问题是默认分词器似乎在分词 Username
字段。虽然我想要前两个字段的标记匹配,但我想要用户名的字符匹配。有没有通过 Azure 门户实现此目的的简单方法?如果没有,我该如何实现?
您能否举例说明您希望对此用户名字段执行的操作?我不确定你所说的字符匹配是什么意思。它是基于 RegEx 的字符匹配吗?如果是这样,也许启用 RegEx 搜索的 custom analyzer 可能有助于此字段?请注意,RegEx 的性能不如典型的索引,因为我们需要扫描整个内容,而不是使用倒排索引来查找标记匹配。
根据您的上述评论添加另一个答案。所以基本上在最好的情况下,你要做的是前缀、后缀和通配符搜索。因此,如果用户名是 user246392,您可以通过键入 "use"、“392”甚至 "er246" 来找到它。前缀很简单,因为您可以搜索 use* 并且它会找到它。
Kendra Little 写了一篇关于如何利用 RegEx with Azure Search 的非常好的博客 post,它可以让您完成您的询问的完整通配符部分(即搜索“392”)。
如果你想进行后缀搜索,你可以做一个非常有效的技巧,你可以创建一个新字段,该字段将是一个自定义分析器,以相反的顺序索引单词。这是一个索引模式的示例,它允许这样做(通过 suffixName 字段)
{
"name":"people",
"fields": [
{ "name":"id", "type":"Edm.String", "key":true, "searchable":false },
{"name": "suffixName", "type": "Edm.String", "searchable":true, "indexAnalyzer":"suffixIndexingAnalyzer", "searchAnalyzer":"reverseText"}
],
"analyzers": [
{
"@odata.type": "#Microsoft.Azure.Search.CustomAnalyzer",
"name": "suffixIndexingAnalyzer",
"tokenizer": "keyword_v2",
"tokenFilters": [
"asciifolding",
"lowercase",
"reverse",
"my_edgeNGramForSuffix"
],
"charFilters": []
},
{
"@odata.type": "#Microsoft.Azure.Search.CustomAnalyzer",
"name": "reverseText",
"tokenizer": "classic",
"tokenFilters": [
"lowercase",
"reverse"
],
"charFilters": []
}
],
"tokenFilters":[
{
"@odata.type": "#Microsoft.Azure.Search.EdgeNGramTokenFilterV2",
"name": "my_edgeNGramForSuffix",
"minGram": 2,
"maxGram": 25,
"side": "front"
}
]
}
我为 DocumentDB
collection 创建了一个 Azure 索引,它似乎工作正常。该索引具有用户帐户的属性,例如 FirstName
、LastName
和 Username
。问题是默认分词器似乎在分词 Username
字段。虽然我想要前两个字段的标记匹配,但我想要用户名的字符匹配。有没有通过 Azure 门户实现此目的的简单方法?如果没有,我该如何实现?
您能否举例说明您希望对此用户名字段执行的操作?我不确定你所说的字符匹配是什么意思。它是基于 RegEx 的字符匹配吗?如果是这样,也许启用 RegEx 搜索的 custom analyzer 可能有助于此字段?请注意,RegEx 的性能不如典型的索引,因为我们需要扫描整个内容,而不是使用倒排索引来查找标记匹配。
根据您的上述评论添加另一个答案。所以基本上在最好的情况下,你要做的是前缀、后缀和通配符搜索。因此,如果用户名是 user246392,您可以通过键入 "use"、“392”甚至 "er246" 来找到它。前缀很简单,因为您可以搜索 use* 并且它会找到它。
Kendra Little 写了一篇关于如何利用 RegEx with Azure Search 的非常好的博客 post,它可以让您完成您的询问的完整通配符部分(即搜索“392”)。
如果你想进行后缀搜索,你可以做一个非常有效的技巧,你可以创建一个新字段,该字段将是一个自定义分析器,以相反的顺序索引单词。这是一个索引模式的示例,它允许这样做(通过 suffixName 字段)
{
"name":"people",
"fields": [
{ "name":"id", "type":"Edm.String", "key":true, "searchable":false },
{"name": "suffixName", "type": "Edm.String", "searchable":true, "indexAnalyzer":"suffixIndexingAnalyzer", "searchAnalyzer":"reverseText"}
],
"analyzers": [
{
"@odata.type": "#Microsoft.Azure.Search.CustomAnalyzer",
"name": "suffixIndexingAnalyzer",
"tokenizer": "keyword_v2",
"tokenFilters": [
"asciifolding",
"lowercase",
"reverse",
"my_edgeNGramForSuffix"
],
"charFilters": []
},
{
"@odata.type": "#Microsoft.Azure.Search.CustomAnalyzer",
"name": "reverseText",
"tokenizer": "classic",
"tokenFilters": [
"lowercase",
"reverse"
],
"charFilters": []
}
],
"tokenFilters":[
{
"@odata.type": "#Microsoft.Azure.Search.EdgeNGramTokenFilterV2",
"name": "my_edgeNGramForSuffix",
"minGram": 2,
"maxGram": 25,
"side": "front"
}
]
}