ElasticSearch搜索部分字母数字值

时间:2012-09-29 10:08:07

标签: elasticsearch n-gram

我有一个字符串字段,其值为PA2456UPA23U-RB,我想进行部分匹配,以便我可以搜索PA24,我会得到第一个结果,或搜索PA23U-RB并找到第二个结果(这样就完全匹配了。

我尝试使用ngram,但忽略了数值,因此,如果我输入pa111,则会返回以pa开头的任何内容

有关示例,请参阅此gist

这可能是一个单独的问题,也可能是相关的问题,但搜索12345001也应符合12345-001

由于

更新 我使用的最终分析器在这里:https://gist.github.com/3803180

1 个答案:

答案 0 :(得分:2)

根据您的要求制作ngrams似乎是一个不错的选择,但我认为edge_ngrams应该足够了。这样你的索引就会慢一点,因为你要索引较少的术语。无论如何,问题是您不需要将相同的分析器应用于查询,否则查询pa111将意味着查询您可以从中获取的所有ngrams,这将引导您进行大量操作您期望的更多匹配。

您只需将search_analyzer更改为不生成ngrams的分析器。您可以使用您已有的相同并删除ngram标记过滤器(仅适用于search_analyzer,index_analyzer很好)。

关于破折号问题,请查看Word delimiter token filter。您需要对其进行配置以使其按预期工作。我想generate_number_parts=falsegenerate_word_parts=falsesplit_on_numerics=false选项可以让它按您的意愿运行。这样,破折号就不会被编入索引。您需要在索引时和查询时应用令牌过滤器。