Me gustaría saber cómo funciona la búsqueda de lucene tan rápido. No encuentro 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 utilizando la búsqueda de texto mysql5 con índice tarda unos 18 minutos en mi caso. Una búsqueda de Lucene para la misma consulta lleva menos de un segundo.
Respuestas:
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 SQL desordenado en un
varchar
campo podría ser igual de rápido y, de hecho, creo que encontrará que las grandes bases de datos pueden hacer una consulta simple 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 instantáneamente . Y no necesita optimizar para actualizaciones de documentos existentes.
Sin embargo, al final del día, si realmente desea saber, debe leer la fuente. Las dos cosas a las que hace referencia son de código abierto, después de todo.
fuente
Lucene crea un gran índice. El índice contiene la identificación de la palabra, el número de documentos donde está presente la palabra y la posición de la palabra en esos documentos. Entonces, cuando realiza una consulta de una sola palabra, solo busca en el índice (complejidad de tiempo O (1)). Luego, el resultado se clasifica utilizando diferentes algoritmos. Para consultas de varias palabras, simplemente tome la intersección del conjunto de archivos donde están presentes las palabras. Por tanto, Lucene es muy, muy rápido.
Para obtener más información, lea este artículo de desarrolladores de Google: http://infolab.stanford.edu/~backrub/google.html
fuente
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 de lista O (N) y una estructura de datos de tabla hash O (1). La lista tiene que recorrer toda la colección para encontrar lo que busca. La tabla hash tiene un índice que le permite averiguar exactamente dónde está el elemento deseado y simplemente buscarlo.
Actualizar:
No estoy seguro de lo que quiere decir 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ás usando MySQL "DONDE documento LIKE '% frase%'" para buscar un documento. Si eso es cierto, entonces MySQL tiene que hacer un escaneo de tabla en cada fila, que será O (N).
Lucene puede analizar el documento en tokens, agruparlos en n-gramos según su dirección y calcular índices para cada uno de ellos. Es O (1) encontrar una palabra en un documento de Lucene indexado.
fuente
Lucene trabaja con Frecuencia de término y Frecuencia de documento inversa . Crea un índice que mapea cada palabra con el documento y su recuento de frecuencia, que no es más que un índice inverso en el documento.
Lucene crea un índice inverso similar a
Archivo 1:
Término: Aleatorio
Frecuencia: 1
Posición: 0
Término: Memoria
Frecuencia: 2
Puesto: 3
Puesto: 6
Por lo tanto, puede 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 como,
Principal
Archivo 1: Frecuencia - 1
Memoria
Archivo 1: Frecuencia - 2
Archivo 2: Frecuencia - 1
El resultado sería Fichero1 seguido por archivo2 . Para dejar de dejarse llevar por el peso de 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).
fuente