天天看点

使用 Elasticsearch 的 NGram 分词器处理模糊匹配

接到一个任务:用 elasticsearch 实现搜索银行支行名称的功能。大概就是用户输入一截支行名称或拼音首字母,返回相应的支行名称。比如,用户输入"工行"或者"gh",我需要返回"工行xxx分行"类似这样的结果。

我心里嘀咕着:数据库不是支持通配符查询吗?为什么不直接用数据库查询?

说归说,但是任务还是要完成的。之前有在网上看过一篇文章,主要就是说用 elasticsearch 处理通配符查询不太适合,然后我在评论中看到作者推荐了一个分词器 ngram。

这个分词器可以让通配符查询和普通的查询一样迅速,因为该分词器在数据索引阶段就把所有工作做完了:

{

"settings": {

},

"mappings": {

}<code>`</code>

当某个字段的 analyzer 被指定为 ngram_analyzer,这个字段的查询就都会变成通配符查询,无论是 term 还是 match。

比如,post /index/type

会得到"中国工商银行xxx分行"、"工行xxx分行"、"中国招商银行xxx分行"。

match 查询会对关键词进行分词,而 lucene 的默认中文分词就是把每个中文字拆开,这样会变成对"工"、"商"两个字做通配符查询。