在Elasticsearch中的“关键字”中搜索完整的子字符串

时间:2018-07-30 10:27:36

标签: elasticsearch substring wildcard n-gram

我有一个包含5亿份文档的索引。每个文档本质上都是字母和数字的“关键字” /字符串(无空格或标点符号)。字符串平均为10个字母,长度为3至40个字符。

我希望能够快速找到关键字字段包含某个子字符串的文档。

我了解到“通配符”搜索(* abc *)缓慢且不可扩展(前缀通配符)。

我现在专注于n-gram。理想情况下,我认为应该将“ min”和“ max”分别设置为3和40。但是,如果在查询中同时将其设置为3并将minimum_should_match设置为100%,则可以获得良好的结果(无需添加大量的额外存储空间对于ngram大小为4-40)。缺点似乎是我得到了一些不必要的结果,例如搜索“ dabc”也会匹配“ abcd”。

我的问题是,如何以最佳方式(性能和存储)实现目标。

我要重新发明轮子吗?我应该只使用ngram最小:3,最大:40吗?

1 个答案:

答案 0 :(得分:0)

您可以尝试使用几种不同的分析策略为字符串建立索引,然后使用ngram过滤掉绝对不属于您要查找的文档的文件,然后对其余的文件使用通配符。您的ngram过滤器将返回一些误报,但这是可以的,因为您的通配符过滤器将解决此问题。您在这里要权衡空间与性能。较小的ngram表示更多的误报(但使用的空间更少),并且通配符过滤器需要更多的工作。

我建议在这里对性能和尺寸做出任何结论之前,先尝试几种方法。

除了通配符,您还可以尝试regexp查询。这可能比通配符查询便宜一些,您可以将其与ngrams过滤器方法结合使用。