es模糊查询的问题
es模糊查询" title="模糊查询">模糊查询的问题
今天在遇到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。所以必须先删除干净索引,重新插入数据,在模糊查询。我的原因就是没有删除索引导致的。一定要记得重新生成索引才可以做到模糊查询的效果。
以上内容皆为本人观点,欢迎大家提出批评和指导,我们一起探讨!
以上是 es模糊查询的问题 的全部内容, 来源链接: utcz.com/z/512262.html