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