Spring-Data-Elasticsearch在底层使用哪个Elasticsearch客户端?

8

我想在我的项目中使用Spring Data Elasticsearch,我看到了这个提示:

从Elasticsearch 7.0.0开始,众所周知的TransportClient已被弃用,并且预计将在Elasticsearch 8.0中删除。

我的做法是只使用Spring Data Elasticsearch执行CRUD操作(类似ORM),并使用High Level REST Client进行搜索和其他操作。因此,我想知道ElasticsearchRepository在执行其操作时使用的客户端是哪一个,以及代码在Elasticsearch 8.0版本中是否仍然有效。
是否仍然决定使用3.1.5版本是个好选择呢?

2个回答

19

一如既往,这取决于具体情况。

关于Elasticsearch:当前的版本是6.7.0,TransportClient也将在ES7中可用,尽管已经被弃用,但只有在ES8中才会被移除,因此还有相当长的时间可以使用它-尽管您应该考虑替换它。

关于spring-data-elasticsearch:

  • 使用ElasticsearchTemplate时,您正在使用TransportClient。
  • 使用ElasticsearchRestTemplate时,您正在使用RestClient(在3.2.0中可用)。
  • 使用默认的ElasticsearchRepository时,您正在使用TransportClient。
  • 如果使用自定义存储库扩展例如下面显示的SimpleElasticsearchRepository,则使用的是RestClient。

示例配置类:

@SpringBootApplication
@EnableElasticsearchRepositories
public class SpringdataElasticTestApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringdataElasticTestApplication.class, args);
    }

    @Bean
    RestHighLevelClient elasticsearchClient() {
        final ClientConfiguration configuration = ClientConfiguration.localhost();
        RestHighLevelClient client = RestClients.create(configuration).rest();
        return client;
    }

    @Bean
    ElasticsearchRestTemplate elasticsearchTemplate() {
        return new ElasticsearchRestTemplate(elasticsearchClient());
    }
}

示例存储库类:

public interface PersonRepository extends ElasticsearchRepository<Person, Long> {
}

示例POJO类:

@Document(indexName = "person")
public class Person {
    @Id
    private Long id;
    private String lastName;
    private String firstName;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
}

在使用3.1.x时,你只能使用TransportClient;而在目前可用的3.2.x里,作为里程碑M2版本,你可以使用RestClient。

确保你的application.yaml(或.properties)中没有任何spring.data.elasticsearch.cluster-*属性,因为这些会注入ElasticsearchTemplate(Transport Client)。

同时,你需要在pom文件中设置正确的elasticsearch和spring-data-elasticsearch版本(摘录如下):

<properties>
    <elasticsearch.version>6.6.1</elasticsearch.version>
</properties>

    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-elasticsearch</artifactId>
        <!-- need 3.2.0 for REST client-->
        <version>3.2.0.M2</version>
    </dependency>

<repository>
    <id>Spring-Framework-Milestone</id>
    <name>Spring Framework Milestone</name>
    <url>http://maven.springframework.org/milestone/</url>
</repository>

谢谢,这正是我在寻找的。 - Ala Abid
1
@Ala 我对示例代码进行了更改,使得Repository只是一个接口,正如它应该的那样,并且ElasticsearchRestTemplate会自动注入到Repository中。如果您对设置有疑问,我可以制作一个小的示例项目并将其放在GitHub上,只需让我知道即可。 - P.J.Meisch
为了能够导入Milestone依赖项,您需要添加Spring Framework里程碑仓库:http://maven.springframework.org/milestone/ - Benoit Wickramarachi
@user1337 我曾经为此苦恼了一段时间,因为在应用程序启动时, ElasticsearchRepository 缺少了 elasticsearchTemplate bean。ElasticsearchRestTemplate 的bean名称需要是 ElasticsearchRestTemplate elasticsearchTemplate() {... ,一旦我纠正了这个问题,接口扩展的其他部分都按照我所期望的方式工作了。 - SuperSaiyen
我知道文档已经非常过时,在某些地方也不正确,这是我正在努力解决的一个问题。 - P.J.Meisch
显示剩余2条评论

1
是的,它确实使用传输客户端。

1
虽然看起来已经被接受了,但值得添加更多细节以使其更有用。链接 - Irf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接