es模糊查询的问题

8,266 阅读2分钟

es模糊查询的问题

今天在遇到es查询的时候,遇到了难点,花了半天才发现问题原因。

需求是:es实现模糊查询。相当于sql中的like %像%一样。但是在开发过程中,我使用了各种分词,各种查询代码,总是实现不了。

问题:

比如:我查询切片面包可以查询出来,但是我查询切面包就查询不出来。

​ 原因是es默认采用了分词机制,导致我查询的时候,切面包没有放在一个分词中,查询不到。

MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("name", name);
//        Iterable<Commodity> iterable = commodityRepository.search(matchQueryBuilder);
//        Iterable<Commodity> iterable = commodityRepository.search(matchQueryBuilder);
//        iterable.forEach(e->list.add(e));

查询资料后,我测试下面的代码:

WildcardQueryBuilder  wildcardQueryBuilder = QueryBuilders.wildcardQuery("name", "*"+name+"*");
Iterable<Commodity> iterable = commodityRepository.search(wildcardQueryBuilder);

测试了一下,还不行。郁闷中。

字段分词器

然后我在字段属性上,加上分词器。先删除es上的数据,然后重新插入数据。

@Field(type = FieldType.Text, analyzer = "ik_max_word")
    private String title; //标题

测试上面二个代码,还是没法查询出切面包的数据。

最后,我尝试删除整个索引,再重新插入数据测试一下

DELETE /commodity

整个命令就是kibaba中的删除索引命令。然后,我在字段属性中设置为keyword:

@Field(type = FieldType.Keyword)
    private String name;

然后,重新插入数据,利用模糊查询代码执行:

WildcardQueryBuilder  wildcardQueryBuilder = QueryBuilders.wildcardQuery("name", "*"+name+"*");
Iterable<Commodity> iterable = commodityRepository.search(wildcardQueryBuilder);

奇迹出现了,居然成功了。无论我查询什么,只要包含,就可以查询出来。终于解决了这个问题,总算松了口气。

总结

在改变了索引(文档)的属性时,原来属性为text,后来改为keyword。所以必须先删除干净索引,重新插入数据,在模糊查询。我的原因就是没有删除索引导致的。一定要记得重新生成索引才可以做到模糊查询的效果。

以上内容皆为本人观点,欢迎大家提出批评和指导,我们一起探讨!