我是 ElasticSearch 的新手,我想要一个连接到数据库 ElasticSearch 8.6 的 Spring Boot 应用程序,以便对索引进行 CRUD 操作。 我试图使用 Spring Boot 和 ElasticSearch 数据库来创建 CRUD 应用程序。
实体:
@Document(createIndex = true, indexName = "client")
public class ClientEntity {
public ClientEntity() {
super();
}
@Id
private String id;
@Field(type = FieldType.Text, name = "name")
private String name;
@Field(type = FieldType.Long, name = "phoneNumber")
private Long phone;
Spring Data 的存储库接口是:
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface ClientRepository extends ElasticsearchRepository<ClientEntity, String> {
}
弹性搜索配置:
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder.HttpClientConfigCallback;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.client.ClientConfiguration;
import org.springframework.data.elasticsearch.client.elc.ElasticsearchConfiguration;
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.rest_client.RestClientTransport;
@Configuration
public class ConfigElasticSearch extends ElasticsearchConfiguration {
@Bean
public ElasticsearchTransport getElasticsearchTransport() {
return new RestClientTransport(getRestClient(), new JacksonJsonpMapper());
}
@Bean
public ElasticsearchClient getElasticsearchClient() {
ElasticsearchClient client = new ElasticsearchClient(getElasticsearchTransport());
return client;
}
@Override
public ClientConfiguration clientConfiguration() {
return ClientConfiguration.builder().connectedTo("localhost:9200")
.withBasicAuth("user", "my-password").build();
}
pom.xml:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.12</version>
</parent>
<properties>
<java.version>17</java.version>
<spring-cloud.version>2021.0.5</spring-cloud.version>
<json-web-token.version>0.9.1</json-web-token.version>
<org-modelmapper.version>3.1.1</org-modelmapper.version>
</properties>
<dependencies>
<dependency>
<groupId>org.modelmapper</groupId>
<artifactId>modelmapper</artifactId>
<version>${org-modelmapper.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- ES -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>jakarta.json</groupId>
<artifactId>jakarta.json-api</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
使用 Spring Data 存储库的服务如下:
@Service("clientPersistence")
public class ClientPersistenceElasticSearchDb {
@Autowired
private ClientRepository clientRepository;
public Stream\<ClientEntity\> findAll() {
return StreamSupport.stream(this.clientRepository.findAll().spliterator(), false);
}
public Optional\<ClientEntity\> findById(String id) {
return clientRepository.findById(id);
}
}
我的微服务的主要配置是:
@SpringBootApplication
public class ClientMicroserviceApplication {
public static void main(String[] args) {
SpringApplication.run(EmpleadosMicroservicioApplication.class, args);
}
}
如果我启动微服务,我会在启动时收到以下信息(然后微服务挂起):
org.springframework.beans.factory.UnsatisfiedDependencyException:创建名称为“clientPersistencia”的bean时出错:通过字段“clientRepository”表达的依赖关系不满足;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建在 es.clientmicroservice.dao.clientRepository 中定义的名为“clientRepository”的 bean 时出错,该 bean 在 ConfigElasticSearch 上声明的 @EnableElasticsearchRepositories 中定义:设置 bean 属性时无法解析对 bean“elasticsearchTemplate”的引用'弹性搜索操作';嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException:创建在类路径资源 [es/clientmicroservice/config/ConfigElasticSearch .class] 中定义的名为“elasticsearchOperations”的 bean 时出错:通过方法“elasticsearchOperations”参数 1 表达的依赖关系不满足;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建在类路径资源 [es/clientmicroservice/config/ConfigElasticSearch .class] 中定义的名为“elasticsearchClient”的 bean 时出错:通过工厂方法实例化 Bean 失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [co.elastic.clients.elasticsearch.ElasticsearchClient]:工厂方法“elasticsearchClient”抛出异常;嵌套异常是 java.lang.NoClassDefFoundError: jakarta/json/spi/JsonProvider
我不知道为什么我的类 clientPersistence 没有构建,因为缺少 JsonProvider 依赖项。
有人可以帮助我吗?
提前谢谢您!!
查看 Spring Boot 版本,您使用的是 Spring Data Elasticsearch 4.4.x(现已停止维护)。您正在使用新 Elasticsearch 客户端 (
org.springframework.data.elasticsearch.client.elc.ElasticsearchConfiguration
) 的配置。当时的新客户端的使用是在 4.4 中引入的,作为一个仍然是新的且可能不稳定的功能。
我没有看到您设置了
jakarta-json.version
(请参阅文档了解新客户端的配置。
您是否有特殊原因覆盖并提供
getElasticsearchTransport()
和 getElasticsearchClient()
?这些 bean 已经由基类提供,您唯一需要提供的方法就是提供配置的方法。
请记住,使用该版本并连接到 Elasticsearch 8 时,您需要在每个请求上设置兼容性标头,请参阅文档了解这一点。
我建议您使用最新版本的 Spring Data Elasticsearch。
您正在使用 spring-boot-starter-parent:2.7.12,这意味着您正在使用 spring-boot-starter-data-elasticsearch:2.7.12。如果您查看依赖项,最后一个依赖于 spring-data-elasticsearch:4.4.12。 4.4.x 的迁移指南表示您需要手动添加一些依赖项。我在问题中显示的
pom.xml
中没有看到任何依赖关系。
我有同样的错误,我使用的版本是: Spring Data Elasticsearch:5.3.2 弹性搜索:8.13.4 Spring框架:6.1.11 根据版本兼容性矩阵:https://docs.spring.io/spring-data/elasticsearch/reference/elasticsearch/versions.html 兼容,但似乎我缺少一些东西, 这是我的 pom.xml:
4.0.0
org.springframework.boot
spring-boot-starter-父级
3.3.2
com.example
弹性搜索测试
0.0.1-快照
弹性搜索测试
弹性搜索测试
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>co.elastic.clients</groupId>
<artifactId>elasticsearch-java</artifactId>
<version>8.13.4</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
我使用的弹性搜索图像是:docker.elastic.co/elasticsearch/elasticsearch:8.13.4