spring boot项目,Elasticsearch的一种使用方式

           最近在做接口服务的项目,用的是微服务架构spring cloud,主要是基于spring boot,使用idea构建真的很方便。离线数据搜索服务,使用的是Elasticsearch,版本5.2.0。在使用过程中,不太顺利,建立client连接一直失败,最后发现是spring boot的原因,得到了解决。

          Elasticsearch和Solr都是搜索引擎,在java项目中使用,非常方便,查询效率也很高。Elasticsearch支持分布式部署,支持全文搜索。具体的使用方式我还未完全掌握,我在项目中的角色是服务接口的开发,关于Elasticsearch,就是使用它检索数据。

          作为程序员,使用不熟悉的知识技能去完成开发任务,是基本技能吧。先在网上查找Elasticsearch的资料,查看别人的使用经验。Elasticsearch使用有2种方式,可以使用HTTP调用,也可以建立client连接使用。由于后期服务量会比较大,决定采用建立client连接的方式查询。首先使用了org.elasticsearch:5.2.2的jar不可以。之后问了下同事,他的工作是数据处理,建索存储,他已经正常使用了。把他的使用方式拿了过来,org.elasticsearch.client:5.2.2版本的jar包,还是不行,非常诡异。

         由于同事已经正常使用,我就感觉是我这边的问题,只好打断点,排查代码了。首先是报这个错误,报错1:Unsupported major.minor version 52.0,经过网上搜索,发现是jdk版本过低的问题,1.7都不行。注意:elasticsearch5.2版本,只能用jdk1.8及以上。

        第一个问题解决后,继续报错。报错2:找不到NetworkPlugin。这个问题在同事那儿是没问题的,继续排查,发现报错是发生在创建client时,new PreBuiltTransportClient时报错。点进去后这个类发现,它不在elasticsearch-5.2.2.jar中,却在elasticsearch-2.4.4.jar中,当然找不到NetworkPlugin了。排除了其他因素,发现是受到了spring boot框架的影响。spring boot自身集成了Elasticsearch,如果没有在pom文件里直接引用elasticsearch-5.2.2,它会默认使用低版本的elasticsearch。本来考虑使用spring boot整合的elasticsearch,但是它支持的版本比较低,不适用于我们的情况。

        报错2:找不到NetworkPlugin

Exception in thread "main" java.lang.NoClassDefFoundError: org/elasticsearch/plugins/NetworkPlugin
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
	at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	at org.elasticsearch.transport.client.PreBuiltTransportClient.(PreBuiltTransportClient.java:84)
	at com.iflytek.ocp.utils.ElasticSearchUtil.init(ElasticSearchUtil.java:107)
	at com.iflytek.ocp.adapter.AdapterApplication.init(AdapterApplication.java:325)
	at com.iflytek.ocp.adapter.AdapterApplication.main(AdapterApplication.java:38)
Caused by: java.lang.ClassNotFoundException: org.elasticsearch.plugins.NetworkPlugin
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	... 16 more


         报错3:ES日志打印的问题,必须加上org.apache.logging.log4j的包。

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/logging/log4j/Level
	at org.elasticsearch.common.logging.ESLoggerFactory.(ESLoggerFactory.java:38)
	at org.elasticsearch.common.logging.Loggers.getLogger(Loggers.java:105)
	at org.elasticsearch.common.logging.Loggers.getLogger(Loggers.java:72)
	at org.elasticsearch.common.component.AbstractComponent.(AbstractComponent.java:37)
	at org.elasticsearch.plugins.PluginsService.(PluginsService.java:98)
	at org.elasticsearch.client.transport.TransportClient.newPluginService(TransportClient.java:99)
	at org.elasticsearch.client.transport.TransportClient.buildTemplate(TransportClient.java:124)
	at org.elasticsearch.client.transport.TransportClient.(TransportClient.java:258)
	at org.elasticsearch.transport.client.PreBuiltTransportClient.(PreBuiltTransportClient.java:125)
	at org.elasticsearch.transport.client.PreBuiltTransportClient.(PreBuiltTransportClient.java:111)
	at org.elasticsearch.transport.client.PreBuiltTransportClient.(PreBuiltTransportClient.java:101)
	at com.iflytek.ocp.utils.ElasticSearchUtil.init(ElasticSearchUtil.java:107)
	at com.iflytek.ocp.adapter.AdapterApplication.init(AdapterApplication.java:325)
	at com.iflytek.ocp.adapter.AdapterApplication.main(AdapterApplication.java:38)
Caused by: java.lang.ClassNotFoundException: org.apache.logging.log4j.Level
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

            总结:1、JDK1.8及以上;2、不仅要使用org.elasticsearch.client包,也要使用elasticsearch-5.2.2包;3、使用org.apache.logging.log4j日志包

            pom文件,maven引用:


		
			org.elasticsearch
			elasticsearch
			5.2.2
		
		
			org.elasticsearch.client
			transport
			5.2.2
		
		
			org.apache.logging.log4j
			log4j-api
			2.7
		
		
			org.apache.logging.log4j
			log4j-core
			2.7
		

         Elasticsearch中文教程推荐:https://elasticsearch.cn/book/elasticsearch_definitive_guide_2.x/

你可能感兴趣的:(java,web框架,数据库及存储技术,elasticsearch,Unsupported,major,spring,boot,NetworkPlugin,搜索引擎)