我需要实现的是左侧匹配。我使用的是查询类型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"
}
}我已经将doucment { Id = "1",Name = "Łódka“}添加到基于Product类创建的索引中。
For搜索查询"Lod*“返回id为1的文档,但搜索查询"Łód*”未返回任何结果。我检查了"polish_analyzer“,对于文本"Łódka”,它返回令牌"lodka“。我的第二种方法是使用EdgeNGramTokenFilterV2,并将其添加到TokenFilters:
new EdgeNGramTokenFilterV2()
{
MaxGram=300,
MinGram=1,
Name="token_edge"
}使用EdgeNGramTokenFilterV2我不需要使用'*‘,左侧匹配对于"Łód“和"Lod”这两种情况都很有效,但我不知道这种解决方案是否有效,因为使用EdgeNGramTokenFilterV2标记过滤器的分析器会生成很多标记。
有人知道为什么左侧匹配在第一种情况下不起作用吗?或者如果第二种方法是有效的?
发布于 2018-02-27 02:02:31
您的前缀查询不会返回任何结果,因为词法分析器不适用于前缀查询术语,您可以在此处了解更多信息:Exceptions to lexical analysis
如果您使用edge ngram标记过滤器,前缀匹配将会更加高效,并且您可以将其与波兰语词干标记赋予器结合使用。
由于两个字段在精确术语匹配和前缀匹配方面的处理方式不同,因此可以使用field-scoped queries对这两个字段进行搜索:
search=NameExact:Łódź NamePrefix:Łód&queryType=fullhttps://stackoverflow.com/questions/48993852
复制相似问题