query - lucene vs elasticsearch
¿Cómo funciona Lucene? (4)
Me gustaría saber cómo funciona la búsqueda lucene tan rápido. No puedo encontrar ningún documento útil en la web. Si tiene algo (menos el código fuente de Lucene) para leer, hágamelo saber.
Una consulta de búsqueda de texto usando búsqueda de texto mysql5 con índice toma aproximadamente 18 minutos en mi caso. Una búsqueda lucene para la misma consulta lleva menos de un segundo.
En una palabra: indexación.
Lucene crea un índice de su documento que le permite buscar mucho más rápidamente.
Es la misma diferencia entre una estructura de datos O (N) de la lista y una estructura de datos O (1) de la tabla hash. La lista tiene que recorrer toda la colección para encontrar lo que desea. La tabla hash tiene un índice que le permite determinar exactamente dónde está el elemento deseado y simplemente buscarlo.
Actualizar:
No estoy seguro de a qué se refiere con "las búsquedas de índice de Lucene son mucho más rápidas que las búsquedas de índice de mysql".
Supongo que está utilizando MySQL "WHERE document LIKE ''% phrase%''" para buscar un documento. Si eso es cierto, MySQL tiene que hacer un escaneo de tabla en cada fila, que será O (N).
Lucene pasa a analizar el documento en fichas, las agrupa en n-gramas según su dirección y calcula índices para cada una de ellas. Es O (1) para encontrar una palabra en un documento indexado de Lucene.
Lucene crea un gran índice. El índice contiene ID de palabra, número de documentos donde está presente la palabra y la posición de la palabra en esos documentos. Entonces, cuando das una sola consulta de palabras, solo busca en el índice (O (1) complejidad de tiempo). Luego, el resultado se clasifica utilizando diferentes algoritmos. Para la consulta de varias palabras simplemente tome la intersección del conjunto de archivos donde están presentes las palabras. Por lo tanto Lucene es muy muy rápido.
Para obtener más información, lea este artículo de los desarrolladores de Google: http://infolab.stanford.edu/~backrub/google.html
Lucene funciona con frecuencia de término y frecuencia de documento inverso . Crea un índice que correlaciona cada palabra con el documento y su recuento de frecuencia que no es más que un índice inverso en el documento.
Ejemplo :
Archivo 1: memoria de acceso aleatorio es la memoria principal.
Archivo 2: los discos duros son memoria secundaria.
Lucene crea un índice inverso algo así como
Archivo 1:
Término: Aleatorio
Frecuencia: 1
Posición: 0
Término: memoria
Frecuencia: 2
Posición: 3
Posición: 6
Por lo tanto, es capaz de buscar y recuperar el contenido buscado rápidamente. Cuando hay demasiadas coincidencias para la consulta de búsqueda, genera el resultado en función del peso. Considere la consulta de búsqueda "Memoria principal" busca las 4 palabras individualmente y el resultado sería similar a,
Principal
Archivo 1: Frecuencia - 1
Memoria
Archivo 1: Frecuencia - 2
Archivo 2: Frecuencia - 1
El resultado sería File1 seguido de File2 . Para dejar de dejarse llevar por los pesos en las palabras más comunes como ''y'', ''o'', ''el'' considera la frecuencia inversa del documento (es decir, ''disminuye el peso de la palabra que es más popular entre el conjunto de documentos).
Lucene es un índice de texto completo invertido. Esto significa que toma todos los documentos, los divide en palabras y luego crea un índice para cada palabra . Dado que el índice es una coincidencia de cadena exacta, desordenada, puede ser extremadamente rápido. Hipotéticamente, un índice desordenado SQL en un campo varchar
podría ser igual de rápido, y de hecho creo que encontrará que las grandes bases de datos pueden hacer una simple consulta de igualdad de cadenas muy rápidamente en ese caso.
Lucene no tiene que optimizar para el procesamiento de transacciones. Cuando agrega un documento, no necesita asegurarse de que las consultas lo vean al instante . Y no necesita optimizar las actualizaciones de los documentos existentes.
Sin embargo, al final del día, si realmente quieres saber, necesitas leer la fuente. Ambas cosas que hace referencia son de código abierto, después de todo.