是否可以在ElasticSearch中组合通配符匹配和ngram?我已经在使用长度为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))));

分析仪:
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
    }))

编辑:
主要目的是允许用户准确地告诉搜索引擎未知字符在哪里。这将保留匹配顺序。我不对查询进行ngram查询,而仅对索引字段进行ngram查询。

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

搜索c.a123?.7?0将按以下顺序给出结果:
  • C.A1234.560
  • C.A1234.800
  • C.A1234.700
  • C.A1234.950
  • 最佳答案

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

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

    关于elasticsearch - 如何在ElasticSearch中对ngram使用通配符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24662877/

    10-11 08:36