query - Comprender los segmentos en Elasticsearch
must match elasticsearch (1)
Estaba bajo la suposición de que cada fragmento en Elasticsearch es un índice. Pero leí en alguna parte que cada segmento es un índice de Lucene.
¿Qué es exactamente un segmento? ¿Cómo afecta el rendimiento de búsqueda? Tengo índices que alcanzan alrededor de 450 GB de tamaño todos los días (creo uno nuevo cada día) con la configuración predeterminada de Elasticsearch.
Cuando ejecuto curl -XPOST "http://localhost:9200/logstash-2013.03.0$i_optimize?max_num_segments=1"
, obtengo num_committed_segments=11
y num_search_segments=11
.
¿No deberían los valores anteriores ser 1? Tal vez se index.merge.policy.segments_per_tier
valor index.merge.policy.segments_per_tier
? ¿Qué es este nivel de todos modos?
La palabra "índice" se abusa un poco en Elasticsearch - se aplica a muchas cosas.
Para explicar:
índice
Un "índice" en Elasticsearch es un poco como una base de datos en una base de datos relacional. Es donde almacena / indexa sus datos. Pero en realidad, eso es exactamente lo que ve su aplicación. Internamente, un índice es un espacio de nombres lógico que apunta a uno o más fragmentos.
Además, "indexar" significa "poner" sus datos en Elasticsearch. Sus datos están almacenados (para su recuperación) e "indexados" para la búsqueda.
índice invertido
Un "índice invertido" es la estructura de datos que Lucene usa para hacer que los datos sean buscables. Procesa los datos, extrae términos o símbolos únicos y luego registra qué documentos contienen esos tokens. Consulte http://en.wikipedia.org/wiki/Inverted_index para obtener más información.
casco
Un "fragmento" es una instancia de Lucene. Es un motor de búsqueda completamente funcional por derecho propio. Un "índice" podría consistir en un único fragmento, pero generalmente consta de varios fragmentos, para permitir que el índice crezca y se divida en varias máquinas.
Un "fragmento primario" es el hogar principal de un documento. Un "fragmento de réplica" es una copia del fragmento primario que proporciona (1) conmutación por error en caso de que el primario muera y (2) aumento en el rendimiento de lectura
segmento
Cada fragmento contiene múltiples "segmentos", donde un segmento es un índice invertido. Una búsqueda en un fragmento buscará cada segmento por turno, luego combinará sus resultados en los resultados finales para ese fragmento.
Mientras indexa documentos, Elasticsearch los recopila en la memoria (y en el registro de transacciones, para mayor seguridad) y cada segundo, escribe un nuevo segmento pequeño en el disco y "actualiza" la búsqueda.
Esto hace que los datos en el nuevo segmento sean visibles para la búsqueda (es decir, son "buscables"), pero el segmento no se ha sincronizado en el disco, por lo que todavía existe el riesgo de pérdida de datos.
De vez en cuando, Elasticsearch se "vaciará", lo que significa que se sincronizarán los segmentos (ahora están "comprometidos") y se borrará el registro de transacciones, que ya no es necesario porque sabemos que los datos nuevos se escribieron en el disco. .
Cuantos más segmentos haya, más tardará cada búsqueda. Por lo tanto, Elasticsearch combinará una serie de segmentos de un tamaño similar ("nivel") en un solo segmento más grande, a través de un proceso de fusión en segundo plano. Una vez que se escribe el nuevo segmento más grande, los segmentos anteriores se descartan. Este proceso se repite en los segmentos más grandes cuando hay demasiados del mismo tamaño.
Los segmentos son inmutables. Cuando se actualiza un documento, en realidad solo marca el documento anterior como eliminado e indexa un nuevo documento. El proceso de fusión también borra estos viejos documentos eliminados.