2009-09-12 29 views
8

No sé qué usan en la búsqueda normal de Windows. Pero hay una técnica en la que utiliza la indexación de archivos a la vez y luego utiliza el índice para una búsqueda más rápida. (Por ejemplo, búsqueda de Windows 4.0)¿Cuál es la técnica/método de búsqueda más rápido? (En el contexto de la búsqueda de archivos)

¿Hay alguna otra manera de realizar búsquedas más rápidas que esta? ¿Puedes elaborar desde el punto de vista de la implementación? (Suponiendo que puedo necesitar para ponerlo en práctica)

Para que sea más fácil de entender, déjame ponerlo de esta manera:

asumir que quiero construir una aplicación de búsqueda que lleva a cabo la operación de búsqueda similar a la uno que usamos en Windows.

Mi pregunta es, ¿cuáles son las posibles opciones/formas/enfoques disponibles para construir tal aplicación? (y que son más rápidos que los ya existentes.)

(puede ser utilizado binario tipo árbol de búsqueda de la técnica?)

+2

Antes que nada, ¿hay alguna razón por la que tiene que construir la suya propia? Hay buenos proyectos de código abierto como Lucene (y NLucene para .NET) que tienen incorporada mucha de esta funcionalidad. A menos que tengas que construir desde cero, utilizaría esta. Incluso si lo hace, comenzaría con la fuente de un proyecto como este. Realmente no hay solo una mejor técnica de búsqueda. Hay una bolsa entera de ellos basada en el contenido y para lo que buscas. Por favor, danos más detalles. –

+0

@ Anthony Gracias Anthony.Sé que hay buenos proyectos de código abierto disponibles para implementar aplicaciones de búsqueda. Pero puede suponer que quiero construirlo desde cero. Sin una razón específica. Y como pregunté antes, me preguntaba, ¿puede ser útil el uso de árboles de búsqueda binarios? Lo digo porque lo leí en algún lado hace mucho tiempo y olvidé el concepto. Veamos si alguien ayuda. –

+0

No creo que pueda obtener una respuesta mejor porque todas las técnicas de búsqueda, incluidas Windows Search 4.0, Google Desktop Search, etc. utilizan indexación internamente y usan árboles B + y se utilizan principalmente para indexar en todas las bases de datos existentes actualmente en el mercado. Y, sinceramente, aparte de la indexación, no existe un método más rápido y el rendimiento de la indexación depende del algoritmo que elija. –

Respuesta

22

Básicamente, hay dos técnicas utilizadas para la búsqueda de texto completo sobre grandes corpúsculos: listas de publicación y matrices de sufijos.

Una lista de publicación es una lista de pares (term, document_id), opcionalmente con una posición en el documento. Si lo ordena o lo clasifica por término, tiene un índice de texto completo que puede buscarse de manera eficiente.

Existen varias técnicas para hacer que las listas de publicaciones sean más pequeñas, de acceso más rápido, más rápidas de actualizar y más flexibles, algunas a costa de la precisión. Lucene es probablemente el mejor indexador de textos basado en la lista de publicaciones disponible en la actualidad, y (a diferencia de su comentario anterior) puede indexar el texto encontrado en archivos PDF, Microsoft Word, etc. El Lucene.net project vinculado por Thomas Maierhofer parece un puerto bastante razonable, aunque, por supuesto, siempre estarás un poco a la vanguardia de lo que está sucediendo en la versión de Java.

Para un corpus que es mucho más grande que la memoria, prácticamente tiene que almacenar la lista de publicaciones en el disco. Esto dificulta el uso de un simple árbol de búsqueda binaria para acceder a él: si tiene cien mil documentos de diez mil palabras cada uno, tiene mil millones de publicaciones, lo que significa que su árbol de búsqueda binaria tiene una profundidad mínima de 30. El problema es que que los 30 nodos en la ruta desde la raíz del árbol a la hoja, en general, se ubicarán en diferentes partes de su disco, por lo que el disco debe buscar 30 veces para encontrar las publicaciones para un término. Eso es aproximadamente 2½ segundos, que es prohibitivamente lento.

Sin embargo, hay una versión modificada de la estructura de datos del árbol binario llamada "B-tree" que puede trabajar. Lucene usa una estructura de datos simple que se parece mucho a un árbol B, pero admite actualizaciones masivas de forma mucho más sencilla. Escribí una versión muy simple de esta misma estructura de datos en mi propio dumbfts project, que implementa un motor de búsqueda de texto completo para mi correo electrónico en algunas páginas de Python. Lo uso todos los días, es software libre, y funciona bastante bien para lo que lo uso, pero no es exactamente un sistema de búsqueda de clase mundial como Lucene.

Como ejemplo de hacer que las listas de publicaciones sean más pequeñas a costa de la precisión, el libro Managing Gigabytes (y el mg4j project) tiene una estructura de datos llamada "tabla hash perfecta mínima firmada", que en realidad no almacena los términos fueron indexados, solo hashes de ellos. Entonces, hay una pequeña probabilidad de un falso positivo: tienes que recuperar los documentos que supuestamente contienen el término para confirmar que realmente lo hacen.

Los arreglos de sufijo, que son una versión mucho más compacta y ligeramente más lenta de radix trees (aka tries), son implementados por GLIMPSE y algunos otros programas, pero básicamente han caído en desuso en estos días. Tienen cierta flexibilidad que no está presente en la estructura de datos de la lista de publicación; permiten búsquedas de expresiones regulares y búsquedas con errores ortográficos, por ejemplo, pero no son tan rápidos. Ha habido algunos trabajos recientes con Burrows-Wheeler Transform, que se basa en matrices de sufijos, y proporciona un algoritmo de compresión en el que el archivo comprimido es ¡el índice de texto completo! La versión mejor documentada de esto se llama FM-index, aunque he oído que hay versiones anteriores de la técnica, tal vez no publicadas.Sin embargo, a diferencia de las otras técnicas descritas anteriormente, creo que esto no funciona cuando los documentos son archivos PDF o algo así. Todavía puedes usar el mismo enfoque de extraer una versión de texto de cada página e indexar eso, pero no lo haces. No obtenga el beneficio de comprimir el documento original.

Mi conocido Tim escribió una muy buena serie introductoria de publicaciones en el blog on search en 2003, que todavía son geniales. Cubren estas cosas (a excepción de los desarrollos recientes) con mucha más profundidad.

Ravi: ¿Este es el tipo de información que estás buscando?

Edit: gracias por arreglar mi formateo, Martin!

+2

+1. Parece que esto (o cualquier otra respuesta) no es suficiente para que empiece el OP. Dudo que cualquier cosa sea. Muy bien escrito. Si no ayudó al OP, al menos me enseñó. –

+0

¡Gracias, Lieven! Creo que el OP no lo ha leído desde que lo publiqué; no ha dejado un comentario aquí ni sobre su pregunta. –

+0

No quise sonar como si me estuviera quejando, solo quería decir que no teníamos información sobre si era "suficiente para usted" o no, porque sus comentarios anteriores no respondían a esta respuesta. –

2

¿Está buscando los nombres de archivo solamente o usted quiere mirar el contenido, así? ¿En qué idioma quieres implementar esto?

Si solo está buscando nombres de archivos, un índice es un gran aumento de rendimiento, mientras que si necesita abrir cada archivo que está buscando, el índice solo ayuda a la manera en que abre solo aquellos archivos donde el contenido que está buscando podría estar ubicado en.

Todavía requiere que abra cada archivo hasta que encuentre lo que está mirando.

+0

Sí. También quiero ver el contenido. Hablando de la parte de implementación, se prefiere el framework .net. –

+0

bien, entonces tiene que recorrer sus archivos, abrir cada uno y hojear el contenido ... una forma sería agregar etiquetas a su índice. etiquetas que indican las categorías más importantes a las que pertenece el archivo actual ... así es como puede encontrar archivos con la velocidad adecuada. saludos – Atmocreations

14

Eche un vistazo a Lucene. Es una biblioteca de búsqueda súper rápida para texto (archivos). También está disponible Lucene.NET. Si desea implementarlo usted mismo, es un buen punto de partida y un punto de referencia para su implementación.

+0

Gracias Thomas por eso. Pero Lucene parece ser suficiente solo para archivos de texto y no para los silencios. –

+2

@Ravi: la solución es extraer texto de archivos PDF, DOC, etc. y alimentar el texto extraído a lucene. –

+0

Exactamente, el libro Lucene in Action tiene una sección completa dedicada a eso. –

1

Búsqueda de texto completo: Imagine que tiene un diccionario de palabras, y para cada palabra, escribió qué documento contenía la palabra y la ubicación exacta de la palabra en ese documento. Esto se conoce como índice de texto completo, y le permite hacer cosas como búsqueda booleana y hacer coincidir una frase exacta. La indexación de texto completo puede escalar fácilmente a millones de documentos y es lo que Windows Search 4.0 generalmente usa. Ver también Lucene o Sphinx.

Búsqueda de concepto: la búsqueda conceptual le permite ingresar un grupo de palabras relevantes (o incluso un documento completo) y devolver documentos que se asemejen más a su información. Basado en su colección de documentos, produce espacios conceptuales que le permiten inferir enlaces semánticos entre palabras. Esto le permite devolver resultados de búsqueda más relevantes porque la computadora "entiende" los conceptos que está buscando y combinará palabras y frases conceptualmente similares. Esto es lo que comúnmente utilizan las soluciones de búsqueda empresarial y de descubrimiento electrónico. Los productos que ofrecen búsqueda conceptual incluyen Engenium y Autonomy.

Búsqueda de meta: en lugar de buscar directamente en el contenido, busca información sobre el contenido, conocida como metadatos. Los metadatos pueden incluir elementos tales como etiquetas, palabras clave, nombre del autor, marca de tiempo, etc. Así que, por ejemplo, si conoce la fecha aproximada en que se escribió un documento, puede incluir esos metadatos en sus criterios de búsqueda para reducir más rápidamente su búsqueda resultados.

Como puede ver, hay muchas maneras de enfocar la búsqueda, y cada una involucra muchos tipos diferentes de estructuras de datos. Si hay un área en particular en la que quieres que me detalle, puedo hacer eso por ti.

1

Hay muchos trabajos de investigación sobre búsqueda de texto completo disponibles en la web, y hay muchos códigos fuente. Si les echas un vistazo, verás que usar un árbol de búsqueda binario no proporcionará buenos resultados en hardware moderno. Un árbol de búsqueda binario es una estructura de datos muy específica que no es lo más rápida posible en una CPU moderna con caché de varios niveles. Las estructuras de datos rápidas tienen un abanico mayor que 2.

Además, el problema es más adecuado para un trie (raíz). Ver wikipedia.

1

Puede utilizar Knuth-Morris-Pratt o más Boyer-búsqueda que son muy rápidos y que no es necesario un índice.

+3

Son lineales en el tamaño de tu corpus.Si tiene un corpus de 15 Gb y su disco puede leer 40 MB por segundo, no obtendrá los resultados de búsqueda durante al menos seis minutos, suponiendo que su CPU sea lo suficientemente rápida como para mantenerse al día con el disco. Por el contrario, consulto diariamente un índice de texto completo en un corpus de 15 GB y obtengo los resultados en segundos. Google tiene un índice de texto completo en varios miles de millones de páginas web y puede ofrecerle resultados de búsqueda en menos de un segundo. –

1

No hay una sola técnica o 'bala de plata'. Pero si empiezas desde cero mejor grok this y this texto estándar sobre el tema.

Cuestiones relacionadas