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

来源:互联网 发布:网络牛牛赌博几率 编辑:程序博客网 时间:2024/06/05 07:39
           最近在做接口服务的项目,用的是微服务架构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/NetworkPluginat 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.<clinit>(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.NetworkPluginat 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/Levelat org.elasticsearch.common.logging.ESLoggerFactory.<clinit>(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.<init>(AbstractComponent.java:37)at org.elasticsearch.plugins.PluginsService.<init>(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.<init>(TransportClient.java:258)at org.elasticsearch.transport.client.PreBuiltTransportClient.<init>(PreBuiltTransportClient.java:125)at org.elasticsearch.transport.client.PreBuiltTransportClient.<init>(PreBuiltTransportClient.java:111)at org.elasticsearch.transport.client.PreBuiltTransportClient.<init>(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.Levelat 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引用:

<!--elasticsearch --><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>5.2.2</version></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>transport</artifactId><version>5.2.2</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.7</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.7</version></dependency>

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

原创粉丝点击