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

时间:2014-07-09 20:05:32

标签: elasticsearch

是否可以在ElasticSearch中组合通配符匹配和ngrams?我已经使用长度为3-11的ngram。

作为一个非常小的例子,我有记录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))));

分析仪:

var projectPartialMatch = new CustomAnalyzer
{
    Filter = new List<string> { "lowercase", "asciifolding" },
    Tokenizer = "ngramtokenizer"
};

标记生成器:

.Tokenizers(t=>t
    .Add("ngramtokenizer", new NGramTokenizer
    {
        TokenChars = new[] {"letter","digit","punctuation"},
        MaxGram = 11,
        MinGram = 3
    }))

编辑: 主要目的是允许用户准确地告诉搜索引擎未知字符的位置。这样可以保留匹配顺序。我没有查询查询,只记录索引字段。

编辑2,测试结果更多: 我有点过分简化了我之前的例子。乱码是由标点符号过滤器引起的。有一个恰当的例子,没有乱码,但结果不会以相关的顺序返回。如下所示,我不确定为什么前2个结果完全匹配。 Ngram不适用于查询。

搜索c.a123?.7?0按此顺序给出结果:

  • C.A1234.560
  • C.A1234.800
  • C.A1234.700&lt; - 首先不应该这样吗?
  • C.A1234.950

1 个答案:

答案 0 :(得分:1)

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

Duc.Duong建议使用Inquisitor插件有助于准确显示数据的分析方式。