提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
如果只是很简单的普通查询建议还是用springboot自带的es工具template什么的,也许更好,但其实这应该是个悖论,就是因为要实现更好更简单的复杂搜索才会上es,像我这次的功能主要是为了实现拼音搜索,用es会比用mysql加个拼音字段再模糊搜索要好的多,以后要实现高亮,中文拼音搜索之类的也会更好实现。
本文主要展示我在集成springboot+elasticsearch+bboss框架遇到的坑。
搭建教程官方文档点这里
一、为什么要用bboss?
为了在xml里直接写动态es查询、建索引语句。
二、遇到的坑
1.kibana、head页面查询结果不一致
把查询落实到代码层面首先还是要先自己跑一下是否能成功,用head插件跑查询多少有点难受,kibana就非常好用,但是要注意这里有坑,同一个Get请求两边返回结果是不一致的,kibana查出的数据是你想要的,而head则查出所有数据。
原因如下:
在kibana上发的get请求实际上是发的post请求,会把body内容都带上,而head上你发get请求就真的发了个get并且不带上body,你实际上是不带条件的全索引查询。要真的验证查询语句,最好还是发post请求,因为实际上你的代码发的带参的es查询是发的post请求(此处看了源码,只要带了xml里的语句,就必发post)
2.head查询结果与bboss框架查询结果不一致,bboss es查询结果为空
其实原因和坑1是一样的,head查询发get请求没有带上body实际查询的是全部数据,而api发的是post请求,结果不一致或为空,其实post结果就是这个,你的es查询语句有问题,有问题的原因有很多,可以通过以下步骤一步步发现问题解决问题。
-
把执行的查询语句打印出来,yml配置要加上spring.elasticsearch.bboss.showTemplate: true
以及logging.level.org.bboss: info 、 logging.level.com.frameworkset:
info 和 logging.level.org.frameworkset: info 以及
ogging.level.org.apache: info 。 -
如果你不用bboss自带的日志,就要在maven引入的时候exclusion掉slf4j
-
将打印出来的语句直接到页面工具head或者kibana上执行,主要要用post请求,验证语句是否有问题,能否查出来你想要的数据,查不出来对吧,是不是用了分析器,并且你正在用分析器模糊搜索某个只有英文以及数字的东西,ik分词无法分割英文和数字,你执行一下index/_analyze用分析器跑一下你想要的识别的文本内容就知道了。到这把查询语句写对基本上就没问题了。
3.遇事不决先查官方文档,不要去瞎百度
elasticsearch更新迭代非常快,百度出来5.x 6.x版本现在根本不适用,7.9之后甚至没有了type,查来的语句一跑一个报错。
bboss官方文档:不仅包含了集成还有各种各样用法的举例与demo
总结
本来想放个我的demo链接上来,想想还是没必要,官方文档里有各种各样的demo,springboot的、非springboot的全都有,上去看看就行。