SpringBoot integra Elasticsearch8.x (8) | (utilizado por el script de lenguaje Painless de la nueva versión Java API Client)

SpringBoot integra Elasticsearch8.x (8) | (utilizado por el script de lenguaje Painless de la nueva versión Java API Client)


Capítulos
Enlaces al Capítulo 1: Integración de SpringBoot con Elasticsearch7.x (1) | (Realización de funciones CRUD)
Enlaces al Capítulo 2: Enlaces a SpringBoot para integrar Elasticsearch7.x (2) | (Consultas complejas)
Enlaces al Capítulo 3: Integración de SpringBoot con Elasticsearch7.x (3) | (consulta de agregación de índice de agregaciones)
Enlace del capítulo 4: SpringBoot integrado Elasticsearch7.x (4) | (consulta de agregación de depósito de agregaciones)
Enlace del capítulo 5: SpringBoot integrado Elasticsearch7.x (5) | coincidencia, match_phrase difference)
Enlace del capítulo 6: SpringBoot integrado Elasticsearch8.x (6) | (nueva versión Java API Client uso)
Capítulo 7 enlace: SpringBoot integrado Elasticsearch8.x (7) | (nueva versión Java API Client utiliza un ejemplo completo)

prefacio

Presentamos Painless Scripting:
Painless es un lenguaje de secuencias de comandos simple y seguro diseñado para usar con Elasticsearch. A partir de ES5.0, es el lenguaje de secuencias de comandos predeterminado para Elasticsearch y se puede usar de manera segura para secuencias de comandos en línea y almacenadas.

Funciones sencillas:
rendimiento impresionante: los scripts sencillos se ejecutan varias veces más rápido que las alternativas (incluido Groovy).
Fuerte seguridad: Utilice la lista blanca para restringir el acceso a funciones y campos, evitando posibles riesgos de seguridad.
Entrada opcional: las variables y los parámetros pueden usar tipos explícitos o tipos de definición dinámica.
Fácil de usar: amplía la sintaxis básica de Java y es compatible con las características del lenguaje de secuencias de comandos de estilo groove.
Optimización específica: ES está diseñado oficialmente para secuencias de comandos de Elasticsearch.

Escenarios de uso:
se utilizan para resolver problemas comerciales complejos, como: campos personalizados, puntaje personalizado, actualizaciones personalizadas, análisis de agregación personalizado, etc.

Desventajas:
Problemas de rendimiento. El documento oficial de optimización del rendimiento señala claramente que el uso de scripts conducirá a un bajo rendimiento;
si no es necesario, no use scripts, intente reemplazarlos con otros métodos.

1. Introducción a la sintaxis de script de Elasticsearch

lang: especifica el idioma en el que está escrito el script. El valor predeterminado es indoloro.fuente
: la fuente es el propio script
params: especifica cualquier parámetro con nombre pasado al script como variables.

	  "script": {
    
    
    "lang":   "",
    "source""",
    "params": {
    
     ... }
  }

2. Preparación de datos en Elasticsearch

Prepare un artículo y guárdelo en la base de datos de ES. versionList es una matriz de lista, que indica la lista de números de versión del artículo. Las operaciones posteriores se realizarán en la versión

{
    
    
	"_index": "64c36a324bfade24ee0f18ab",
	"_id": "ACNZm4kBoucrmKIhwyQC",
	"_version": 1,
	"_score": 1,
	"_source": {
    
    
		"id": "c32e0056a6284ee7b2ea6e483ce874e2",
		"docId": "64c36af14bfade24ee0f18ba",
		"parentId": "64c36af14bfade24ee0f18ba",
		"docName": "Csdn博客介绍.pdf",
		"fileExtension": "pdf",
		"content": "CSDN是全球知名中文IT技术交流平台,创建于1999年,包含原创博客、精品问答、职业培训、技术论坛、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区",
		"title": "Csdn博客介绍",
		"sort": 13,
		"versionList": [
			1
		]
	}
}

3. Caso de implementación de script

1. Agregar datos de tipo Lista en es en lotes

Para los requisitos comerciales, es necesario crear una nueva versión sobre una versión existente. La implementación específica es la siguiente, busque el artículo de la versión correspondiente y luego agréguelo.

    public void addVersion(String indexName, Integer fromVersion, Integer newVersion) {
    
    
        Map<String, JsonData> map = Maps.newHashMap();
        map.put("newVersion", JsonData.of(newVersion));
        try {
    
    
            client.updateByQuery(d -> d
                    .index(indexName)
                    .query(q -> q
                            .term(t -> t
                                    .field("libVersionList")
                                    .value(fromVersion)
                            ))
                    .script(s -> s
                            .inline(src -> src
                                    .lang("painless")
                                    .source("ctx._source.versionList.add(params.newVersion)")
                                    .params(map)
                            )
                    )
            );
        } catch (IOException e) {
    
    
            log.error(e.getMessage());
        }
    }

2. Datos de tipo de lista de eliminación por lotes en es

Para las necesidades comerciales, se debe eliminar una determinada versión. La implementación específica es la siguiente. Busque el artículo de la versión correspondiente y luego elimine el número de versión. Nota:
aquí debe facilitar la lista de versiones, encontrar el subíndice correspondiente y el . La operación remove () es eliminar los datos correspondientes a la ubicación

    public void deleteVersion(String indexName, Integer version) {
    
    
        Map<String, JsonData> map = Maps.newHashMap();
        map.put("version", JsonData.of(version));
        try {
    
    
            client.updateByQuery(d -> d
                    .index(indexName)
                    .query(q -> q
                            .term(t -> t
                                    .field("versionList")
                                    .value(version)
                            )
                    )
                    .script(s -> s
                            .inline(src -> src
                                    .lang("painless")
                                    .source("for (int i = 0; i < ctx._source.versionList.length; i++){if(params.version == ctx._source.versionList[i]){ctx._source.versionList.remove(i)}}")
                                    .params(map)
                            )
                    )
            );
        } catch (IOException e) {
    
    
            log.error( e.getMessage());
        }
    }

Resumir

Lo anterior es el uso de secuencias de comandos en el cliente java de elasticsearch para realizar operaciones por lotes y nuevas en la duplicación de datos. Es muy simple de operar si está familiarizado con la sintaxis.

Supongo que te gusta

Origin blog.csdn.net/Oaklkm/article/details/132021693
Recomendado
Clasificación