SpringBoot integrado Elasticsearch8.x (6) | (utilizado por la nueva versión Java API Client)
Capítulo
Capítulo
Enlace al Capítulo 1: Integración de SpringBoot con Elasticsearch7.x (1) | (Creación, eliminación, modificación y verificación de la implementación de funciones)
Enlace al Capítulo 2: Integración de SpringBoot a Elasticsearch7.x (2) |
Enlace al Capítulo 3: Integración de SpringBoot a Elasticsearch7.x(3)|(consulta de agregación de índice de agregaciones)
Enlace del capítulo 4: SpringBoot Integrated Elasticsearch7 . , match, match_phrase difference) Enlace del capítulo 6: SpringBoot Integrated Elasticsearch8.x (6) | (nueva versión del cliente API de Java utilizado) Enlace del capítulo 7: SpringBoot integrado Elasticsearch8.x (7) | (nueva versión de Java API Client utilizada ejemplo completo)
prefacio
El cliente java utilizado por ElasticSearch antes de la versión 7.17 es Java REST Client, pero a partir de la versión 7.17, el Java REST Client oficial se marca como obsoleto (obsoleto) y se recomienda una nueva versión de Java Client. Este artículo presenta el uso básico de la nueva versión de ElasticSearch Java Client
1. Introducción a la versión del cliente de ElasticSearch
1. El cliente JAVA REST ES proporciona dos versiones de cliente REST (utilizadas después de la versión 7.17)
Cliente REST de bajo nivel de Java: el cliente oficial de bajo nivel para Elasticsearch. Permite comunicarse con el clúster de Elasticsearch a través de http. Deje la ordenación de la solicitud y la ordenación de la respuesta al usuario. Es compatible con todas las versiones de Elasticsearch.
Ava High Level REST Client: El cliente oficial de alto nivel para Elasticsearch. Se basa en un cliente de bajo nivel, que proporciona muchas API y es responsable de ordenar las solicitudes y desarmar las respuestas. (PD: es como, uno es pasar la cadena que ha unido y analizar el resultado devuelto usted mismo; mientras que el otro es pasar el objeto, el resultado devuelto también ha sido encapsulado, es directamente el objeto, y el el nombre del parámetro está más estandarizado y el formato, que está un poco más orientado a objetos)
2、Cliente TransportClient
El uso de la interfaz de transporte para la comunicación puede utilizar algunas funciones en el clúster ES y el rendimiento es el mejor. La versión del paquete JAR debe ser coherente con la versión del clúster ES. Cuando se actualiza el clúster ES, el cliente también se actualiza a la misma versión.
3. Cliente Java de ElasticSearch (recomendado para la versión 8.x)
El cliente API de Java consta de tres partes: la clase correspondiente del cliente Java es ElasticsearchClient, se usa un mapeador de objetos JSON para la serialización y deserialización de datos, la comunicación de transporte subyacente, y también proporciona llamadas sincrónicas y asincrónicas, transmisión y llamadas funcionales, sin problemas. integrado con Jackson, encapsula el grupo de conexiones, el reintento, la serialización json y otras capacidades generales
2. Introducción y configuración de dependencias
1. Dependencias del cliente de Elasticsearch y dependencias de jackson
La dependencia de jackson generalmente existe en el proyecto springboot y no es necesaria. Elasticsearch8.x se usa oficialmente en springbott3.x. En cuanto a si la versión inferior es factible, debe verificarse.
<dependency>
<groupId>co.elastic.clients</groupId>
<artifactId>elasticsearch-java</artifactId>
<version>8.5.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.3</version>
</dependency>
2. Configuración de conexión de cliente y servicio es
Aquí inicializamos tres tipos de cliente
1, cliente 2 de bajo nivel
y transporte de comunicación, y usamos JacksonJsonpMapper para analizar datos.
3. Bloqueo del cliente Java
RestClient restClient = RestClient.builder(
new HttpHost("localhost", 9200)).build();
ElasticsearchTransport transport = new RestClientTransport(
restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
3. Operación de índice
1. Determinar si el índice existe
El código de implementación es el siguiente
/**
* 判断索引是否存在
*
* @param indexName
* @return
* @throws IOException
*/
public boolean hasIndex(String indexName) throws IOException {
BooleanResponse exists = client.indices().exists(d -> d.index(indexName));
return exists.value();
}
2. Eliminar el índice
El código de implementación es el siguiente
/**
* 删除索引
*
* @param indexName
* @throws IOException
*/
public boolean deleteIndex(String indexName) throws IOException {
DeleteIndexResponse response = client.indices().delete(d -> d.index(indexName));
return true;
}
3. Crea un índice
El código de implementación es el siguiente
/**
* 创建索引,不允许外部直接调用
*
* @param indexName
* @param mapping
* @throws IOException
*/
private boolean createIndex(String indexName, Map<String, Property> mapping) throws IOException {
CreateIndexResponse createIndexResponse = client.indices().create(c -> {
c.index(indexName).mappings(mappings -> mappings.properties(mapping));
return c;
});
return createIndexResponse.acknowledged();
}
mapeo de compilación
public Map<String, Property> buildMappingV2( Map<String, String> propertyKeys) {
Map<String, Property> documentMap = new HashMap<>();
for (Map.Entry<String, String> propertyKey : propertyKeys.entrySet()) {
String type = getIndxPropType(propertyKey.getValue());
String key = propertyKey.getKey();
log.info("属性:{}类型:{}", key, type);
if (type.equals("text")) {
documentMap.put(key, Property.of(property ->
property.keyword(KeywordProperty.of(p ->
p.index(true)
)
)
)
);
} else if (type.equals("date")) {
documentMap.put(key, Property.of(property ->
property.date(DateProperty.of(p ->
p.index(true).format("yyyy-MM-dd HH:mm:ss.SSS")
)
)
)
);
} else if (type.equals("long")) {
documentMap.put(key, Property.of(property ->
property.long_(LongNumberProperty.of(p ->
p.index(true)
)
)
)
);
} else if (type.equals("integer")) {
documentMap.put(key, Property.of(property ->
property.integer(
IntegerNumberProperty.of(p ->
p.index(false)
)
)
)
);
} else {
documentMap.put(key, Property.of(property ->
property.object(
ObjectProperty.of(p ->
p.enabled(true)
)
)
)
);
}
}
return documentMap;
}
4. Vuelva a crear el índice
El código de implementación es el siguiente
/**
* 重新创建索引,如果已存在先删除
*
* @param indexName
* @param mapping
*/
public void reCreateIndex(String indexName, Map<String, Property> mapping) {
try {
if (this.hasIndex(indexName)) {
this.deleteIndex(indexName);
}
} catch (IOException e) {
e.printStackTrace();
throw new WrapperException(RetCode.NOT_AVAILABLE, "删除索引失败");
}
try {
this.createIndex(indexName, mapping);
} catch (IOException e) {
e.printStackTrace();
throw new WrapperException(RetCode.NOT_AVAILABLE, "重新创建索引失败");
}
}
# 总结
以上就是SpringBoot集成Elasticsearch数据库内容,在验证过程中遇到很多问题,输出的文档都是经过验证可执行的,后续会慢慢更新文章,尽量覆盖全面,如果大家在使用过程中遇到问题欢迎留言。