首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在ElasticSearch中使用ngram通配符

如何在ElasticSearch中使用ngram通配符
EN

Stack Overflow用户
提问于 2014-07-09 20:05:31
回答 1查看 1.1K关注 0票数 5

在ElasticSearch中可以组合通配符匹配和ngram吗?我已经在用3-11长度的纳克了。

作为一个很小的例子,我有记录C1239123和C1230123。用户希望返回这两种情况。这是他们唯一知道的信息:C 123?12。

上面的情况不会在我的完全匹配分析器上工作,因为查询在末尾缺少了3。我当时的印象是通配符匹配会被打破,但是如果我执行类似于上面的搜索,我就会胡说八道。

查询:

代码语言:javascript
复制
.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))));

分析器:

代码语言:javascript
复制
var projectPartialMatch = new CustomAnalyzer
{
    Filter = new List<string> { "lowercase", "asciifolding" },
    Tokenizer = "ngramtokenizer"
};

托肯器:

代码语言:javascript
复制
.Tokenizers(t=>t
    .Add("ngramtokenizer", new NGramTokenizer
    {
        TokenChars = new[] {"letter","digit","punctuation"},
        MaxGram = 11,
        MinGram = 3
    }))

编辑:主要目的是让用户告诉搜索引擎的确切位置未知的字符。这保留了匹配顺序。我不记录查询,只有索引字段。

用更多的测试结果编辑2:我简化了前面的示例太多了。这种胡言乱语是由标点符号过滤器造成的。用一个恰当的例子来说,没有胡言乱语,但结果并没有按照相应的顺序返回。看到下面,我不知道为什么前两个结果完全匹配。Ngram不应用于查询。

搜索c.a 123?.7?0按以下顺序给出结果:

  • C.A1234.560
  • C.A1234.800
  • be 1234.700<--这不是第一次吗?
  • C.A1234.950
EN

回答 1

Stack Overflow用户

发布于 2014-07-28 16:59:52

对于任何想要解决这个问题的人来说,默认情况下通配符都是在ngrammed标记上使用的。我的问题是因为我的查询中包含标点符号,并且在查询中使用了标准分析器(它破坏了标点符号)。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24662877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档