Azure 搜索 - 左侧匹配

Azure Search - left side match

我需要实现的是左侧匹配。我正在使用完整的查询类型。请在下面找到我的型号和分析仪:

public class Product
{
    [System.ComponentModel.DataAnnotations.Key]
    public string Id { get; set; }

    [IsSearchable, Analyzer("polish_analyzer")]
    public string Name { get; set; }
}

Analyzers = new[]
{
    new CustomAnalyzer()
    {
        Name="polish_analyzer",
        Tokenizer = "polish_tokenizer",
        TokenFilters = new TokenFilterName[] {"lowercase", "asciifolding" }
    }
},
Tokenizers = new[]
{
    new MicrosoftLanguageStemmingTokenizer()
    {
        Language = MicrosoftStemmingTokenizerLanguage.Polish,
        IsSearchTokenizer = true,
        Name = "polish_tokenizer"
    }
}

我已将文档 { Id = "1", Name = "Łódka" } 添加到索引中,该索引是基于产品 class 创建的。

对于搜索查询 "Lod*" 正在 return 编辑 ID 为 1 的文档,但搜索查询“Łód*”没有 return 任何结果。我检查了 "polish_analyzer",对于文本“Łódka”,它 return 是令牌 "lodka"。 我的第二种方法是使用 EdgeNGramTokenFilterV2,并将其添加到 TokenFilters:

new EdgeNGramTokenFilterV2()
{
    MaxGram=300,
    MinGram=1,
    Name="token_edge"
}

使用 EdgeNGramTokenFilterV2,我不必使用“*”,左侧匹配在“Łód”两种情况下都可以正常工作,"Lod"但我不知道此解决方案是否有效作为分析器EdgeNGramTokenFilterV2 令牌过滤器产生大量令牌。

有人知道为什么左侧匹配在第一种情况下不起作用吗?或者第二种方法是否有效?

您的前缀查询没有 return 任何结果,因为词法分析器未应用于前缀查询术语,您可以在此处了解更多信息:Exceptions to lexical analysis

如果您使用边缘 ngram 标记过滤器,前缀匹配会更有效,您可以将它与波兰语词干标记器结合使用。

对于精确术语匹配和前缀匹配,两个字段的处理方式不同,您可以使用 field-scoped queries 对两者进行搜索:

search=NameExact:Łódź NamePrefix:Łód&queryType=full