是否可以在ElasticSearch中结合使用通配符匹配和ngrams?我已经在使用长度为3-11的ngrams.
作为一个非常小的例子,我有记录C1239123和C1230123.用户想要返回这两个.这是他们所知道的唯一信息:C123?12
上面的情况不适用于我的完整匹配分析器,因为查询缺少3的结尾.我的印象是通配符匹配可以开箱即用,但如果我执行类似于上面的搜索,我会得到胡言乱语.
查询:
.Search<ElasticSearchProject>(a => a
.Size(100)
.Query(q => q
.SimpleQueryString(query => query
.OnFieldsWithBoost(b => b
.Add(f => f.Summary, 2.1)
.Add(f => f.Summary.Suffix("ngram"), 2.0)
.Query(searchQuery))));
Run Code Online (Sandbox Code Playgroud)
分析:
var projectPartialMatch = new CustomAnalyzer
{
Filter = new List<string> { "lowercase", "asciifolding" },
Tokenizer = "ngramtokenizer"
};
Run Code Online (Sandbox Code Playgroud)
标记生成器:
.Tokenizers(t=>t
.Add("ngramtokenizer", new NGramTokenizer
{
TokenChars = new[] {"letter","digit","punctuation"},
MaxGram = 11,
MinGram = 3
}))
Run Code Online (Sandbox Code Playgroud)
编辑:主要目的是允许用户准确地告诉搜索引擎未知字符的位置.这样可以保留匹配顺序.我没有查询查询,只有索引字段.
编辑2有更多的测试结果:我已经简化了我之前的例子.乱码是由标点符号过滤器引起的.有一个恰当的例子,没有乱码,但结果不会以相关的顺序返回.如下所示,我不确定为什么前2个结果完全匹配.Ngram不适用于查询.
搜索c.a123?.7?0会得到以下顺序的结果:
对于任何寻求解决方案的人来说,默认情况下,ngrammed 令牌上使用通配符。我的问题是由于我的查询中包含标点符号,并在查询中使用标准分析器(标点符号中断)。
Duc.Duong 关于使用 Inquisitor 插件的建议有助于准确展示如何分析数据。
| 归档时间: |
|
| 查看次数: |
840 次 |
| 最近记录: |