如何在ElasticSearch中使用带有ngrams的通配符

Bra*_*don 5 elasticsearch

是否可以在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会得到以下顺序的结果:

  • C.A1234.560
  • C.A1234.800
  • C.A1234.700 < - 这不应该是第一个吗?
  • C.A1234.950

Bra*_*don 1

对于任何寻求解决方案的人来说,默认情况下,ngrammed 令牌上使用通配符。我的问题是由于我的查询中包含标点符号,并在查询中使用标准分析器(标点符号中断)。

Duc.Duong 关于使用 Inquisitor 插件的建议有助于准确展示如何分析数据。