elasticsearch实现like查询
问题
elasticsearch查询需要实现类似于mysql的like查询效果,例如值为hello中国233
的记录,即可以通过中国
查询出记录,也可以通过llo
查询出记录。
但是elasticsearch的查询都是基于分词查询,hello中国233
会默认分词为hello
、中
、国
、233
。当使用hello
查询时可以匹配到该记录,但是使用llo
查询时,匹配不到该记录。
解决
由于记录内容分词的结果的粒度不够细,导致分词查询匹配不到记录,因此解决方案是将记录内容以每个字符进行分词。即把hello中国233
分词为h
、e
、l
、o
、中
、国
、2
、3
。
elasticsearch默认没有如上效果的分词器,可以通过自定义分词器实现该效果:通过字符过滤器,将字符串的每一个字符间添加一个空格,再使用空格分词器将字符串拆分成字符。
效果
默认分词
1 | PUT /like_search |
分词效果
1 | GET /like_search/_analyze |
1 | { |
elasticsearch默认使用standard
分词器,如下通过llo
查询不到hello中国233
的记录。
1 | GET /like_search/_search |
自定义分词
1 | PUT /like_search |
分词效果
1 | GET /like_search/_analyze |
1 | { |
使用自定义的分词器,如下通过llo
可以查询到hello中国233
的记录。
1 | GET /like_search/_search |