果然上篇博客说的不熟悉Elasticsearch最终害了我。。今天重新运行我的博客项目,发现我昨天写的博文还在,并且我没法写blog了出现如下报错:
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalArgumentException: Expected 1 but found 7 results] with root cause
网上找不到解决方案,但我根据我对这个报错的理解,加上昨天写的博文还在。综合分析了一下,觉得可能是IDEA缓存的原因(其实这里想偏了跟IDEA毛关系没有,IDEA缓存也不会缓存数据库相关的东西啊)于是清空IDEA缓存。。没有任何效果。。
又想了想可能是mysql的表没有删干净。但由于我要对项目各个功能进行测试,我在applications.properties文件中配置的是:
spring.jpa.hibernate.ddl-auto=create-drop
也就是说每次运行项目都会把之前的数据给清空掉然后重新建表,也就说理论上不应该。但是试试吧死马当活马医。重复删表建表几次之后,不出意料,仍然没有半点解决掉的迹象。。。
。。逐渐抓狂,然后仔细阅读报错日志,发现是elasticsearch的问题。于是想了想可能是elasticsearch缓存的问题吧,于是网上找解决方案清空缓存,仍然失效。最后发现,是由于虽然表删了,但是elasticsearch的索引数据并没有删,然后导致两者对应不上,也就说说elasticsearch中的主键对应了多条数据从而产生了那样的结果:
Expected 1 but found 7 results。那么问题就很好解决了。删掉索引就好,然后把
spring.jpa.hibernate.ddl-auto=create-drop
改成
spring.jpa.hibernate.ddl-auto=update
即可,这样数据库每次就不会删表,就可以和elasticsearch对上了。
那么如何删除索引呢?我的做法是投机取巧选择下个elasticsearch可视化工具然后去删除hhh最简单的做法
(纯属自己琢磨,如有问题欢迎大佬指出)
使用中文分词器 IK Analysis时的错误
failed to load elasticsearch nodes : org.elasticsearch.index.mapper.MapperParsingException: Mapping definition for [tags] has unsupported parameters: [fielddata : true] [search_analyzer : ik_smart] [analyzer : ik_smart]
这个报错原因似乎时没有识别到IK Analysis。看网上解决方案把tags对应的type改为keyword并不生效,并且keyword会和已存在的type为keyword的数据项冲突。
后来发现问题在于安装完分词器后要重启elasticsearch
重启过程中遇到报错:
StartupException: org.elasticsearch.bootstrap.BootstrapException: java.nio.file.NoSuchFileException: D:\elasticsearch-5.5.0\plugins\commons-codec-1.9.jar\plugin-descriptor.properties
解决方法:不要把分词器内的jar包直接解压到plugins文件夹下,在它下面再建一个文件夹命名为IK Analysis即可,把相应的东西放在它里面就行
我简直是把能踩的坑踩了个遍。。。。
这次更坚定了我要补elasticsearch的决心。