2010-04-24 8 views
68

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.Cómo funciona Lucene

Una consulta de búsqueda de texto usando la 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.

+1

¿Puedo solicitar esta pregunta para ser convertido como un wiki de la comunidad? Lucene suena como una plataforma ahora. – asyncwait

Respuesta

63

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 desea saberlo, debe leer la fuente. Ambas cosas que hace referencia son de código abierto, después de todo.

+0

Si entiendo correctamente, lo que diferencia a los motores de búsqueda de texto es cómo manejan las búsquedas de palabras múltiples y unir los resultados de las búsquedas a múltiples índices en tiempo real. No recomendaría consultar la fuente de Lucene para esto.Probablemente sería mejor leer un poco acerca de la teoría de búsqueda de texto, la respuesta de @ alienCoder me ayudó. –

+1

@bmargulies, si la indexación es "por palabra", ¿por qué la búsqueda de usuarios de stackoverflow http://stackoverflow.com/users permite coincidencias de subcadenas? – Pacerier

+1

Este no es el lugar para respuestas enteras. Hay muchas elaboraciones sobre el concepto básico allí. – bmargulies

16

En una palabra: indexación.

Lucene crea un índice de su documento que le permite buscar mucho más rápido.

Es la misma diferencia entre una lista de estructura de datos O (N) y una tabla de hash O (1) estructura de datos. 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.

Actualización:

No estoy seguro de lo que quiere decir con "búsquedas de índice Lucene son mucho más rápido que las búsquedas de índice de MySQL".

Supongo que está utilizando MySQL "DONDE el documento 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 consigue analizar el documento en tokens, agruparlos en n-grams en su dirección y calcular índices para cada uno de ellos. Es O (1) para encontrar una palabra en un documento indexado de Lucene.

+8

Sí Entiendo la parte de indexación, pero de nuevo, las búsquedas de índice de lucene son mucho más rápidas que las búsquedas de índice de mysql. ¿Cómo ocurre? – Midhat

21

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 más información leer este artículo por Google Desarrolladores- http://infolab.stanford.edu/~backrub/google.html

+4

Despachado sobre ese papel, fue bastante útil. Específicamente "4.5 Searching" tenía la respuesta que estaba buscando. Específicamente, parece que se utiliza una búsqueda de hash O (1) para palabras individuales, pero luego se usa una exploración de O (n) para unir los resultados con un límite de 40,000 documentos. Supongo que se usa un algoritmo map-reduce para dividir este trabajo de modo que el usuario obtenga resultados instantáneos. –

+0

Un algoritmo popular es el algoritmo de rango de palomas. Aunque no sé mucho al respecto. – alienCoder

+2

Ese documento es divertido: "En este documento, presentamos Google, un prototipo ...". Supongo que Google no siempre fue una mega corporación. – Buttons840