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

时间:2019-05-23 23:56:35

标签: azure lucene tokenize azure-search

我为我的DocumentDB集合创建了一个Azure索引,它似乎运行良好。索引具有用户帐户的属性,例如FirstNameLastNameUsername。问题在于默认标记器似乎正在标记Username字段。虽然我希望前两个字段的令牌匹配,但我希望用户名的字符匹配。有没有一种简单的方法可以通过Azure门户实现这一目标?如果没有,我该如何实现?

2 个答案:

答案 0 :(得分:1)

根据您的上述评论添加另一个答案。因此,基本上在最佳情况下,您想要做的是前缀,后缀和通配符搜索。因此,如果用户名是user246392,则可以通过键入“ use”,“ 392”甚至“ er246”来找到它。前缀很简单,因为您可以搜索use *并找到它。

Kendra Little在如何利用RegEx with Azure Search方面做了一篇非常不错的博客文章,它可以让您完成询问的完整通配符部分(即搜索“ 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"
    }
]

}

答案 1 :(得分:0)

您能举例说明您要在此用户名字段中执行的操作吗?我不确定您所说的字符匹配是什么意思。它是基于RegEx的字符匹配吗?如果是这样,也许启用了RegEx搜索的custom analyzer可能有助于此字段?请注意,RegEx的性能不如典型的索引,因为我们需要扫描整个内容,而不是通过反向索引来查找令牌匹配。