【问题标题】:Elastic Search with Java使用 Java 进行弹性搜索
【发布时间】:2017-03-05 05:09:41
【问题描述】:

我正在尝试像这样连接到 Elastic Search,

Transport client = new PreBuiltTransportClient(Settings.EMPTY).
                    addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9200));

但我在运行时遇到以下错误:-

Exception in thread "main" java.lang.AbstractMethodError: io.netty.util.concurrent.MultithreadEventExecutorGroup.newChild(Ljava/util/concurrent/Executor;[Ljava/lang/Object;)Lio/netty/util/concurrent/EventExecutor;
at io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:84)
at io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:58)
at io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:47)
at io.netty.channel.MultithreadEventLoopGroup.<init>(MultithreadEventLoopGroup.java:49)

我的 pom.xml 是

<dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>5.2.1</version>
</dependency>
 <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-core</artifactId>
      <version>2.6.2</version>
</dependency>

请帮忙提前谢谢

【问题讨论】:

    标签: java elasticsearch


    【解决方案1】:

    我猜这可能是因为在将弹性搜索的版本从低于 2.4 的版本升级到当前版本方面,您最终的实现发生了变化。

    使用current version 实现上述内容的正确方法是 -

    TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
            .addTransportAddress(new InetSocketTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9200));
    

    Version 2.3 之前的实现是:

    Client client = TransportClient.builder().build()
        .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host1"), 9300))
        .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host2"), 9300));
    

    我将按照AbstractMethodError here的定义进行

    当应用程序尝试调用抽象方法时抛出。一般, 这个错误被编译器捕获; 此错误只能在运行时发生 如果某个类的定义从那时起发生了不兼容的更改,则时间 当前执行的方法最后一次编译。

    为此,我还建议您检查 mvn dependency:treeexclude 工件 org.elasticsearch.client 的任何其他依赖项。

    【讨论】:

      【解决方案2】:

      9200 是 Elasticsearch REST API 的端口。要从 Java 客户端连接,您应该使用端口 9300。我不知道为什么堆栈跟踪和错误消息如此不清楚......

      【讨论】:

      • 该死的,很好的捕捉,甚至没有注意到这一点。 +1 投票给你,我更新了我的答案以避免混淆。
      【解决方案3】:

      您的初始化语法看起来是正确的,并且您的 pom 中没有任何内容会导致 JAR 地狱或任何其他冲突,但是您如何拥有它存在一个问题:

      使用TransportClient 对象而不是您尝试使用的Transport 对象。

      TransportClient client = new PreBuiltTransportClient(Settings.EMPTY).
                              addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));
      

      Transport 是 Elasticsearch 存储库中的一个接口,请参阅 here。传输客户端依赖于 Elasticsearch 的其余部分,请参阅 here,并下载它并将其添加到项目的依赖项中。这意味着,当你说Transport它时...

      1. 不是您要查找的 TransportClient。
      2. 您无意中引用了 Elasticsearch 主代码中的 Transport 接口。

      【讨论】:

        【解决方案4】:
         //Try this method...
            TransportClient client = null;
            public Client getConnection(){
            if (client == null) {
                        Settings settings = Settings.builder().put("cluster.name", 
                   "elasticsearch").put("client.transport.sniff", true).build();
            try {
                // preparing client object...
            client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"),9300));
                        } catch (UnknownHostException e) {
                            e.printStackTrace();
                        }
        
                    }
        
                    return client;
        

        【讨论】:

          猜你喜欢
          • 2021-02-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-10
          • 1970-01-01
          • 1970-01-01
          • 2022-11-22
          相关资源
          最近更新 更多