如何在我的java应用程序中启动elasticsearch 5.1?

时间:2016-12-23 09:16:08

标签: java elasticsearch

使用elasticsearch 2.x我使用以下代码启动嵌入式节点进行测试:

@Bean
public Node elasticSearchTestNode() {
    return NodeBuilder.nodeBuilder()
            .settings(Settings.settingsBuilder()
                    .put("http.enabled", "true")
                    .put("path.home", "elasticsearch-data")
                    .build())
            .node();
}

这不再编译。如何在5.x中启动嵌入式节点?

4 个答案:

答案 0 :(得分:15)

嵌入弹性搜索不再是官方支持的,它比2.x更复杂,但它可以工作。

您需要添加一些依赖项:

    <dependency>
        <groupId>org.elasticsearch</groupId>
        <artifactId>elasticsearch</artifactId>
        <version>5.1.1</version>
        <scope>test</scope>
    </dependency>
    <dependency><!-- required by elasticsearch -->
        <groupId>org.elasticsearch.plugin</groupId>
        <artifactId>transport-netty4-client</artifactId>
        <version>5.1.1</version>
        <scope>test</scope>
    </dependency>
    <dependency><!-- required by elasticsearch -->
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.7</version>
    </dependency>

然后启动这样的节点:

@Bean
public Node elasticSearchTestNode() throws NodeValidationException {
    Node node = new MyNode(
            Settings.builder()
                    .put("transport.type", "netty4")
                    .put("http.type", "netty4")
                    .put("http.enabled", "true")
                    .put("path.home", "elasticsearch-data")
                    .build(),
            asList(Netty4Plugin.class));
    node.start();
    return node;
}

private static class MyNode extends Node {
    public MyNode(Settings preparedSettings, Collection<Class<? extends Plugin>> classpathPlugins) {
        super(InternalSettingsPreparer.prepareEnvironment(preparedSettings, null), classpathPlugins);
    }
}

答案 1 :(得分:6)

使ES5正常工作的最简单方法是使用Allegro embedded-elasticsearch library(文章here中的更多信息)。经过一天努力将ES5嵌入jar级别后,我发现它非常简单。包括在你的pom中:

<dependency>
    <groupId>pl.allegro.tech</groupId>
    <artifactId>embedded-elasticsearch</artifactId>
    <version>2.5.0</version>
    <scope>test</scope>
</dependency>

并在单元测试中使用以下代码

EmbeddedElastic embeddedElastic = EmbeddedElastic.builder()
        .withElasticVersion("5.5.2")
        .withSetting(PopularProperties.HTTP_PORT, 21121)
        .build();
embeddedElastic.start();

测试将自动下载Elastic,并在操作系统进程级别的测试驱动的隔离环境中运行。 http://localhost:21121证明它有效。

我们的应用程序必须与不同版本的ES进行交互。所以这就是为什么这个解决方案对我们的案例也很有用的另一个原因,因为我们不能通过在类路径中添加多个elasticsearch.jars来测试多个版本的ES。

注意:如果这种方法类似于“穷人的Docker”,你也可以查看TestContainers项目。虽然我认为你的测试基础设施可以使用Docker,但我自己并没有自己尝试过。

答案 2 :(得分:5)

不支持。

您应该阅读this blog post

编辑:

这就是我解决integration tests with maven问题的方法。

答案 3 :(得分:0)

不再支持嵌入式Elasticsearch

您可以使用此Maven依赖项,它将为您启动Elasticsearch 6集群

<dependency>
     <groupId>org.elasticsearch-6</groupId>
     <artifactId>elasticsearch-embedded-cluster</artifactId>
     <version>1.0-SNAPSHOT</version>
</dependency>

您可以阅读有关的更多详细信息 https://github.com/nitishgoyal13/elasticsearch-6-embedded-cluster