编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

小小的一个ES有这么多知识点,ElasticSearch模糊查询的问题

wxchong 2024-12-14 15:36:10 开源技术 29 ℃ 0 评论


ElasticSearch模糊查询的问题

今天在遇到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。所以必须先删除干净索引,重新插入数据,在模糊查询。我的原因就是没有删除索引导致的。一定要记得重新生成索引才可以做到模糊查询的效果。

分享给你一张 Elasticsearch 核心知识图谱,只有对每一个知识点仔细梳理并深入理解,才能解决工作中的实际问题。关注私信回复:555 领取Java高级架构资料

感谢支持哦,认真写文章,用心做分享。个人公种浩【java耕耘者】,文章都会在里面更新,整理的资料也会放在里面。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表