我有一个字符串字段,其值为PA2456U
或PA23U-RB
,我想进行部分匹配,以便我可以搜索PA24
,我会得到第一个结果,或搜索PA23U-RB
并找到第二个结果(这样就完全匹配了。
我尝试使用ngram,但忽略了数值,因此,如果我输入pa111
,则会返回以pa
开头的任何内容
有关示例,请参阅此gist。
这可能是一个单独的问题,也可能是相关的问题,但搜索12345001
也应符合12345-001
由于
更新 我使用的最终分析器在这里:https://gist.github.com/3803180
答案 0 :(得分:2)
根据您的要求制作ngrams似乎是一个不错的选择,但我认为edge_ngrams应该足够了。这样你的索引就会慢一点,因为你要索引较少的术语。无论如何,问题是您不需要将相同的分析器应用于查询,否则查询pa111
将意味着查询您可以从中获取的所有ngrams,这将引导您进行大量操作您期望的更多匹配。
您只需将search_analyzer更改为不生成ngrams的分析器。您可以使用您已有的相同并删除ngram标记过滤器(仅适用于search_analyzer,index_analyzer很好)。
关于破折号问题,请查看Word delimiter token filter。您需要对其进行配置以使其按预期工作。我想generate_number_parts=false
,generate_word_parts=false
和split_on_numerics=false
选项可以让它按您的意愿运行。这样,破折号就不会被编入索引。您需要在索引时和查询时应用令牌过滤器。