¿Cómo actúa Lucene?

90

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.

Midhat
fuente
2
¿Puedo solicitar que esta pregunta se convierta en una wiki comunitaria? Lucene suena como una plataforma ahora.
asyncwait

Respuestas:

75

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 varcharcampo 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.

bmargulies
fuente
Si lo entiendo correctamente, lo que distingue a los motores de búsqueda de texto es cómo manejan las búsquedas de varias palabras y unen los resultados de las búsquedas a múltiples índices en tiempo real. No sugeriría consultar la fuente de Lucene para esto. Probablemente sería mejor leer un poco sobre la teoría de la búsqueda de texto, la respuesta de @ alienCoder me ayudó.
Chris Dutrow
1
@bmargulies, si la indexación es "por palabra", ¿por qué la búsqueda de usuarios de stackoverflow stackoverflow.com/users permite coincidencias de subcadenas?
Pacerier
2
Este no es el lugar para respuestas de libros completos. Hay una serie de elaboraciones sobre el concepto básico allí.
bmargulies
¿Qué quiere decir con "un índice para cada palabra" ... si empiezo a escribir "abc", cómo va a encontrar "abc" en el documento?
Alexander Mills
1
Un índice (árbol B) de palabra a documento puede buscar documentos por palabras en el documento porque la tabla de dicho índice es (palabra, documento) donde el índice está en la columna de palabras. Considere una consulta como: "Busque documentos con las palabras 'policía', 'crimen', 'estadísticas'". Al buscar en el índice de palabras, puede realizar tres búsquedas de registro (N) para obtener documentos O (N) con una de esas palabras. Luego, puede hacer dos bucles O (N) para crear un conjunto que contenga documentos que tengan las tres palabras. Aunque esta es teóricamente una operación O (N), la mayoría de los documentos no tienen las tres palabras, por lo que es O (n) donde n <N.
Calicoder
34

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

alienCoder
fuente
8
Hojeado ese papel, fue muy útil. Específicamente "4.5 Buscando" tenía la respuesta que estaba buscando. Específicamente, parece que se usa una búsqueda hash O (1) para palabras individuales, pero luego se usa un escaneo O (n) para unir los resultados con un límite de 40,000 documentos. Supongo que se utiliza un algoritmo de reducción de mapas para dividir este trabajo de modo que el usuario obtenga resultados instantáneos.
Chris Dutrow
Un algoritmo popular es el algoritmo de rango de paloma. Aunque no sé mucho al respecto.
alienCoder
3
Ese artículo es divertido: "En este artículo, presentamos a Google, un prototipo ...". Supongo que Google no siempre fue una megacorporación.
Buttons840
No conozco a Lucene, pero una pregunta: ¿La clasificación ocurre en cada búsqueda? ¿O mantiene los documentos precalificados? Si mantiene los documentos según el rango de antemano, ¿cómo lo mantiene para la consulta de varias palabras?
Vikas Prasad
El vínculo está roto ahora. @alienCoder
CEGRD
20

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.

duffymo
fuente
10
Sí, entiendo la parte de indexación, pero nuevamente, las búsquedas de índice de lucene son mucho más rápidas que las búsquedas de índice de mysql. ¿Cómo sucede eso?
Midhat
8

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.

Ejemplo :

Archivo 1: La memoria de acceso aleatorio es la memoria principal.

Archivo 2: Los discos duros son memoria secundaria.

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).

Tom Taylor
fuente