如何在 Azure 搜索索引中获取字符匹配而不是子字符串

How to get character matches in Azure Search index instead of substrings

我为 DocumentDB collection 创建了一个 Azure 索引,它似乎工作正常。该索引具有用户帐户的属性,例如 FirstNameLastNameUsername。问题是默认分词器似乎在分词 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"
    }
]

}