Introducción a Elasticsearch y uso en springboot

​¿Qué pasa si

  1. Si hay decenas de millones de registros en la tabla, este problema de rendimiento, y si hay otro campo de texto que debe configurarse vagamente en ella, causará graves problemas de rendimiento.
  2. Todavía no es posible separar los términos de búsqueda. Por ejemplo, lo anterior solo puede buscar empleados cuyos nombres comiencen con "Zhang San". Si desea buscar "Zhang Xiaosan", no podrá buscar.
    En términos generales, el uso de bases de datos para implementar la búsqueda no es muy confiable y, por lo general, el rendimiento será deficiente.

Elasticsearch es un motor de búsqueda (sistema de análisis) de código abierto (distribuido)
es un motor de análisis y búsqueda de código abierto distribuido desarrollado sobre la base de Apache Lucene.

  • Un almacén de documentos distribuido en tiempo real, cada campo se puede indexar y buscar
  • Un motor de búsqueda analítico distribuido en tiempo real
  • Es capaz de expandir cientos de nodos de servicio y admite datos estructurados o no estructurados a nivel de PB.

Elasticsearch es un motor de búsqueda moderno que proporciona múltiples funciones, como almacenamiento persistente y estadísticas.

Es a la vez un motor de búsqueda y una base de datos [base de datos no relacional] y no admite transacciones ni relaciones complejas (al menos la versión 1.X no es compatible, la 2.X ha mejorado, pero el soporte aún no es bueno)

​Búsqueda de texto completo : la base de datos de texto completo es el componente principal del sistema de búsqueda de texto completo. La llamada base de datos de texto completo es una colección de datos que se forma transformando todo el contenido de una fuente de información completa en unidades de información que pueden ser reconocidas y procesadas por una computadora. Las bases de datos de texto completo no solo almacenan información, sino que también tienen la función de editar y procesar aún más palabras, caracteres, párrafos, etc. en datos de texto completo, y todas las bases de datos de texto completo son bases de datos de información masiva.
Por ejemplo : cuando ingresamos "desintegración completa", se dividirá en dos palabras "completa" y "desintegración". Use 2 palabras para recuperar datos en el índice invertido y devolver los datos recuperados. Todo el proceso se llama búsqueda de texto completo.

Índice invertido : busque registros según el valor del atributo. Dado que el valor del atributo no está determinado por el registro, pero la ubicación del registro está determinada por el valor del atributo, se denomina índice invertido.
Cada entrada en dicha tabla de índice incluye un valor de atributo y las direcciones de los registros que tienen el valor de atributo.
Un archivo con un índice invertido se denomina archivo de índice invertido o, para abreviar, archivo invertido.

Lucene es un conjunto de herramientas de motor de búsqueda de código abierto (un paquete jar que contiene códigos empaquetados para crear índices invertidos y búsquedas, incluidos varios algoritmos). Solr también es un motor de búsqueda distribuido de código abierto basado en Lucene. Hay muchas similitudes con
Elasticsearch .
Elasticsearch comenzó con la búsqueda de texto completo y convirtió el kit de desarrollo de Lucene en un producto de datos, protegiendo varias configuraciones complejas de Lucene y brindando a los desarrolladores una comodidad amigable. Muchas bases de datos relacionales tradicionales también proporcionan búsqueda de texto completo, algunas basadas en Lucene incrustadas, otras basadas en desarrollo propio. En comparación con Elasticsearch, la función es única, el rendimiento no es muy bueno y la escalabilidad es casi inexistente.

ES resuelve estos problemas

1. Mantenimiento automático de la distribución de datos para el establecimiento de índices en múltiples nodos, así como la ejecución de solicitudes de búsqueda distribuidas en múltiples nodos.
2. Mantenimiento automático de copias redundantes de datos para garantizar que los datos no se pierdan una vez que la máquina deja de funcionar.
3. Encapsula funciones más avanzadas, como la función de análisis de agregación y búsqueda basada en la ubicación geográfica .

Características de ElasticSearch

  1. Se puede utilizar como tecnología de clúster distribuido a gran escala (cientos de servidores) para procesar datos a nivel de PB y servir a grandes empresas; también se puede ejecutar en una sola máquina para servir a pequeñas empresas.
  2. Elasticsearch no es una tecnología nueva, combina principalmente recuperación de texto completo, análisis de datos y tecnología distribuida.
  3. Para los usuarios, está listo para usar y es muy simple. Como aplicación pequeña y mediana, implemente ES directamente en 3 minutos.
  4. Elasticsearch es un complemento de las bases de datos tradicionales, como búsqueda de texto completo, procesamiento de sinónimos, clasificación de correlación, análisis de datos complejos y procesamiento de datos masivos casi en tiempo real;

escenas a utilizar

Si comenzar un nuevo proyecto, usar Elasticsearch como único almacén de datos puede ayudar a mantener su diseño lo más simple posible. Sin embargo, este escenario no admite operaciones que impliquen actualizaciones y transacciones frecuentes.

Un ejemplo es el siguiente : cree un nuevo sistema de blog y use es como almacenamiento.
1) Podemos enviar nuevas publicaciones de blog a ES;
2) Usar ES para recuperar, buscar y contar datos.

Escenario 2: agregar Elasticsearch al sistema existente
Dado que ES no puede proporcionar todas las funciones de almacenamiento, en algunos escenarios es necesario agregar soporte de ES sobre la base del almacenamiento de datos del sistema existente.
inserte la descripción de la imagen aquí
Si utiliza una base de datos SQL y almacenamiento ES como se muestra, necesita encontrar una manera 使得两存储之间实时同步. Debe seleccionar el complemento de sincronización correspondiente según la composición de los datos y la base de datos. Los complementos disponibles incluyen:

1) mysql, logstash-input-jdbccomplementos de selección de Oracle. 【El canal también está bien】

2) mongo selecciona la herramienta mongo-connector

Consulta de aplicaciones
Elasticsearch es mejor para realizar consultas: basado en el algoritmo central del índice invertido, el rendimiento de la consulta es más sólido que todos los productos de datos del tipo B-Tree, especialmente las bases de datos relacionales. Cuando la cantidad de datos supera decenas de millones o cientos de millones, la eficiencia de la recuperación de datos es muy obvia.

Elasticsearch se utiliza en escenarios generales de aplicaciones de consultas. Las bases de datos relacionales están limitadas por el principio del lado izquierdo del índice. La ejecución del índice debe tener un orden estricto. Si hay pocos campos de consulta, puede mejorar el rendimiento de la consulta creando una pequeña cantidad de índices. Si hay muchos campos de consulta y los campos están desordenados, entonces el índice pierde su significado; por el contrario, Elasticsearch crea índices para todos los campos de forma predeterminada, y todas las consultas de campos no necesitan garantizar el orden, por lo que Utilice Elasticsearch en lugar de bases de datos relacionales para consultas generales en una gran cantidad de sistemas de aplicaciones comerciales. Las consultas de bases de datos son muy exclusivas. Excepto por las consultas más simples, Elasticsearch se utiliza para otras consultas de condiciones complejas.
En el campo de big data,
Elasticserach se ha convertido en uno de los componentes importantes de la plataforma de big data para proporcionar consultas externas. La plataforma de big data calcula iterativamente los datos originales y luego envía los resultados a una base de datos para consultarlos, especialmente para grandes lotes de datos detallados. ​El famoso conjunto de tres piezas de recuperación de
registros se refiere a una cartera de productos especialmente diseñada para la recopilación, el almacenamiento y la consulta de registros. 5) Campo de monitoreo 6) Aprendizaje automático
ELKElasticsearch,Logstash,Kibana

Introducción básica a los componentes ES

inserte la descripción de la imagen aquí

Metadatos del documento
Un documento contiene no sólo sus datos, sino también metadatos: información sobre el documento. Los tres elementos de metadatos requeridos son los siguientes: ¿
  _index   Dónde se almacena el documento?
  _type    La categoría de objeto representada por el documento
  _id        El identificador único del documento.


# ES se usa en springboot
  • Introducir dependencias

en pom.xml, unirsespring-boot-starter-data-elasticsearch

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
  • Escribir un archivo de configuración
server:
  port: 9001
es:
  schema: http
  address: 192.168.0.1:9200
  connectTimeout: 10000
  socketTimeout: 20000
  connectionRequestTimeout : 50000
  maxConnectNum: 16
  maxConnectPerRoute: 20
  • Clase de entidad:
@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(indexName = "shen")
public class User {
    
    
    @Id 
    private String id;

    // 用在属性上 代表mapping中一个属性 一个字段 type:属性 用来指定字段类型 analyzer:指定分词器
    @Field(type = FieldType.Text,analyzer = "ik_max_word")
    private String name;

    @Field(type = FieldType.Integer)
    private Integer age;

    @Field(type = FieldType.Text)
    private Date bir;

    @Field(type = FieldType.Text,analyzer = "ik_max_word")
    private String introduce;

    @Field(type = FieldType.Text,analyzer = "ik_max_word")
    private String address;
}
  • Insertar un documento en es
	/**
	 * ElasticSearch Rest client操作
	 *
	 * RestHighLevelClient 更强大,更灵活,但是不能友好的操作对象
	 * ElasticSearchRepository 对象操作友好
	 *
	 * 我们使用rest client 主要测试文档的操作
	 **/
	// 复杂查询使用:比如高亮查询
	@Autowired
    RestHighLevelClient restHighLevelClient;

    @Override
    public ResponseInfo addUsers(User user) throws IOException {
    
    
        IndexRequest indexRequest = new IndexRequest("shen");
        indexRequest.source(JSONObject.toJSONString(user), XContentType.JSON);
        IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
        return ResponseInfo.ok(indexResponse);
    }
  • interfaz de llamada
    inserte la descripción de la imagen aquí
  • Utilice kibana para ver los resultados en es:
    inserte la descripción de la imagen aquí
    /**
     * 更新
     */
	@Override
    public ResponseInfo updateDoc(User user) throws IOException {
    
    
        Document document = user.getClass().getAnnotation(Document.class);
        UpdateRequest updateRequest = new UpdateRequest(document.indexName(), user.getId());
        updateRequest.doc(JSONObject.toJSONString(user), XContentType.JSON);
        UpdateResponse updateResponse = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
        return ResponseInfo.ok(updateResponse);
    }

    /**
     * 删除
     */
    @Override
    public ResponseInfo deleteDoc(User user) throws IOException {
    
    
        Document document = user.getClass().getAnnotation(Document.class);
        DeleteRequest deleteRequest = new DeleteRequest(document.indexName(), user.getId());
        DeleteResponse deleteResponse = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
        return ResponseInfo.ok(deleteResponse);
    }

    /**
     * 批量更新
     */
    @Override
	public void bulkUpdate() throws IOException {
    
    
        BulkRequest bulkRequest = new BulkRequest();
        // 添加
        IndexRequest indexRequest = new IndexRequest("shen");
        indexRequest.source("{\"name\":\"张三\",\"age\":23,\"bir\":\"1991-01-01\",\"introduce\":\"西藏\",\"address\":\"拉萨\"}", XContentType.JSON);
        bulkRequest.add(indexRequest);
        // 删除
        DeleteRequest deleteRequest01 = new DeleteRequest("shen","pYAtG3kBRz-Sn-2fMFjj");
        DeleteRequest deleteRequest02 = new DeleteRequest("shen","uhTyGHkBExaVQsl4F9Lj");
        DeleteRequest deleteRequest03 = new DeleteRequest("shen","C8zCGHkB5KgTrUTeLyE_");
        bulkRequest.add(deleteRequest01);
        bulkRequest.add(deleteRequest02);
        bulkRequest.add(deleteRequest03);
        // 修改
        UpdateRequest updateRequest = new UpdateRequest("shen","pYAtG3kBRz-Sn-2fMFjj");
        updateRequest.doc("{\"name\":\"曹操\"}",XContentType.JSON);
        bulkRequest.add(updateRequest);

        BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
        BulkItemResponse[] items = bulkResponse.getItems();
        for (BulkItemResponse item : items) {
    
    
            System.out.println(item.status());
        }
    }
/**
     * 查询
     * @throws IOException
     */
    @Test
    public void testSearch() throws IOException {
    
    
        //创建搜索对象
        SearchRequest searchRequest = new SearchRequest("shen");
        //搜索构建对象
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        searchSourceBuilder.query(QueryBuilders.matchAllQuery())//执行查询条件
                .from(0)//起始条数
                .size(10)//每页展示记录
                .postFilter(QueryBuilders.matchAllQuery()) //过滤条件
                .sort("age", SortOrder.DESC);//排序

        //创建搜索请求
        searchRequest.source(searchSourceBuilder);

        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        System.out.println("符合条件的文档总数: "+searchResponse.getHits().getTotalHits());
        SearchHit[] hits = searchResponse.getHits().getHits();
        for (SearchHit hit : hits) {
    
    
            System.out.println(hit.getSourceAsMap());
        }
    }





Sitio web oficial de ES

uso de kibana

ElasticSearch se utiliza en Springboot

Supongo que te gusta

Origin blog.csdn.net/JemeryShen/article/details/126488385
Recomendado
Clasificación