Red de conocimiento informático - Conocimiento informático - Cómo llamar datos en Elasticsearch

Cómo llamar datos en Elasticsearch

Debido a la necesidad de mejorar la calidad de búsqueda del proyecto, recientemente estudié Elasticsearch, que es un muy buen programa de búsqueda distribuida. Algunas de las notas originales se publicaron en github, por lo que aquí hay solo un resumen.

En primer lugar, ¿por qué utilizar Elasticsearch? Al principio, nuestro proyecto solo usaba MySQL para búsquedas simples. Más tarde, aparecieron declaraciones similares que no se podían indexar, lo que redujo directamente el rendimiento de MySQL. Más tarde, también consideramos Sphinx, y Sphinx se implementó con éxito en proyectos anteriores. Sin embargo, considerando el volumen de datos actual, múltiples MySQL, el HA del servicio de búsqueda en sí y los problemas de expansión posteriores, sentimos que Sphinx no era adecuado para su uso. Proyectos anteriores. No es una elección óptima. Así que, naturalmente, recurrimos a Elasticsearch.

Según la propia introducción del sitio web oficial, Elasticsearch es un servicio de búsqueda distribuida que proporciona una API Restful, la capa subyacente se basa en Lucene y utiliza múltiples fragmentos para garantizar la seguridad de los datos y proporcionar fragmentación automática. Elasticsearch como servicio de búsqueda, decidimos utilizar Elasticsearch en nuestro proyecto.

Para Elasticsearch, si desea utilizarlo en un proyecto, debe resolver los siguientes problemas:

Index. El índice correspondiente también debe usarse de manera diferente según el lenguaje específico, etc.

Búsqueda, Elasticsearch proporciona una función de búsqueda muy poderosa. ¿Cómo escribir declaraciones de búsqueda eficientes?

Fuente de datos, todos nuestros datos se almacenan en MySQL. MySQL es la única fuente de datos. ¿Cómo importar datos de MySQL a Elasticsearch?

Para 1 y 2, dado que todos nuestros datos se generan desde MySQL y los campos de índice son fijos, el trabajo principal a realizar es diseñar el mapeo y las declaraciones de búsqueda correspondientes de acuerdo con el escenario empresarial. En realidad, no puede ser tan simple y debemos ajustarlo constantemente.

En cuanto a 3, necesitamos una herramienta para importar datos de MySQL a Elasticsearch. Debido a que tenemos altos requisitos de búsqueda en tiempo real, necesitamos importar datos incrementales de MySQL en tiempo real, y es la única manera que puedo. Lo que se piensa es lograrlo a través de la línea binlog. El trabajo más reciente es implementar la sincronización incremental de MySQL con el servicio Elasticsearch.

Lucene

La capa inferior de Elasticsearch se basa en Lucene, que es una excelente biblioteca de búsqueda. Por supuesto, no la he usado antes.

Conceptos clave en Lucene:

Documento: La fuente de datos principal utilizada para la indexación y la búsqueda, que contiene uno o más campos que contienen los datos con los que interactuamos con Lucene.

Campo: Componente del Documento, que consta de nombre y valor.

Término: palabra indivisible, la unidad más pequeña de búsqueda.

Token: representación de un término que contiene su contenido, su posición inicial en el documento y su tipo.

Lucene utiliza un índice invertido para almacenar la relación de mapeo entre términos en el documento.

Documentación, por ejemplo:

Elasticsearch Server 1.0 (Documentación 1)

Mastring Elasticsearch (Documentación 2)

Libro de recetas de Apache Solr 4 (Documento 3)

Utilice índice invertido para almacenar relaciones de mapeo simples:

Términos

Recuento

Documentos

1.0 1 <1>

4 1 <3>

Apache 1 <3 >

Libro de cocina 1 <3>

Elasticsearch 2 <1>.<2>

Masterización 1 <2>

Servidor 1 <1>

Solr 1 <3>

En el ejemplo anterior, primero segmentamos el documento en etiquetas una por una mediante el algoritmo de segmentación de palabras, luego obtenemos la asignación entre etiquetas y documentos y registramos el número total de apariciones de las etiquetas.

Conceptos clave de Elasticsearch

Para utilizar Elasticsearch, creo que sólo necesitas comprender algunos conceptos básicos.

A nivel de datos, existen principalmente:

Índice: Elasticsearch se utiliza para almacenar áreas lógicas de datos, que es similar al concepto db en las bases de datos relacionales.

Un índice puede ubicarse en uno o más fragmentos y un fragmento puede tener varias copias.

Documento: Datos de la entidad almacenados internamente en Elasticsearch, similar a una fila de datos en una tabla de datos relacionales.

Un documento consta de varios campos y los campos con el mismo nombre en diferentes documentos deben ser del mismo tipo. Los campos pueden aparecer repetidamente en un documento, es decir, un campo puede tener múltiples valores, es decir, múltiples valores.

Tipo de documento: para necesidades de consulta, puede haber varios documentos en un índice, es decir, tipos de documentos. Sin embargo, cabe señalar que los campos con el mismo nombre en diferentes documentos deben tener el mismo tipo.

Mapeo: almacena la información de mapeo de los campos. Los diferentes tipos de documentos tendrán diferentes mapeos.

Para aquellos que estén familiarizados con MySQL, solo debemos pensar que el índice es una base de datos, el documento es una fila de datos, el campo es una columna y el mapeo es una tabla. La columna y la asignación son la definición de una tabla y el tipo de documento es una tabla.

El concepto de tipo de documento en realidad confundió al autor desde el principio, de hecho, es para una mejor consulta. Para dar un ejemplo simple, en un índice, puede haber algunos datos que necesitemos usar. query. , y para la otra parte de los datos necesitamos usar otra consulta, por lo que hay dos tipos. Pero esto no debería suceder en nuestro proyecto, por lo que normalmente solo hay un tipo bajo un índice.

A nivel de servicio se encuentran:

Nodo: una instancia de servidor.

Clúster: Múltiples nodos forman un clúster.

Fragmentación: fragmentación de datos, un índice puede existir en varios fragmentos y diferentes fragmentos pueden ubicarse en diferentes nodos.

Réplica: una copia de seguridad de un fragmento. Hay un fragmento principal y el resto se denominan fragmentos de réplica.

La razón principal por la que Elasticsearch puede volver a particionar dinámicamente es que preasigna múltiples fragmentos al principio (parece 1024) y luego migra los datos uno por uno. En realidad, esta práctica es muy común en el mundo distribuido y codis utiliza 1024 espacios para la migración de datos.

Dado que cualquier índice se puede configurar con múltiples copias, las copias de seguridad redundantes pueden garantizar la seguridad de los datos y las copias también pueden compartir la presión de lectura, similar a la base de datos esclava de MySQL.

API Restful

Elasticsearch proporciona una API Restful, que utiliza formato json, lo que la hace muy útil para interactuar con el mundo externo.

Aunque Elasticsearch tiene una gran cantidad de clientes, escribí fácilmente un cliente simple para usar en mi proyecto, lo que una vez más confirmó que Elasticsearch es realmente fácil de usar.

La interfaz de Restful es muy simple. Una URL representa un recurso específico, como /blog/article/1, que representa el índice del blog, el tipo representa el artículo y la identificación representa 1 documento.

Utilizamos métodos estándar http para operar estos recursos. POST significa agregar, PUT significa actualizar, GET significa obtener, DELETE significa eliminar y HEAD significa determinar si existe.

Aquí recomendamos httpie a todos, que es una herramienta http muy poderosa. Personalmente creo que es más útil que curl y es casi la mejor opción para depurar Elasticsearch a través de la línea de comandos.

Algunos ejemplos del uso de httppie:

# create

http POST :9200/blog/article/1 title="hello elasticsearch" etiquetas:='[ "elasticsearch"]'

# get

http GET: 9200/blog/article/1

# update

http PUT: 9200/blog/article/1 title="hola elasticsearch" etiquetas:='["elasticsearch", "hola"]'

# eliminar

http BORRAR: 9200/blog/ artículo/1

# existe

http HEAD :9200/blog/article/1