2009-11-18 18 views
8

Estoy usando Lucene para indexar y buscar una pequeña cantidad de documentos grandes. Usando la demostración del sitio de Lucene he indexado los documentos y puedo buscarlos. Sin embargo, el resultado de la búsqueda no es particularmente útil ya que apunta al archivo del documento. Con documentos muy grandes, esto no es particularmente útil.¿Puede Lucene devolver varios resultados de búsqueda de un solo archivo indexado?

Me pregunto si Lucene puede indexar estos documentos muy grandes y crear una abstracción sobre ellos que proporcione resultados mucho más precisos.

Un ejemplo podría explicar mejor a qué me refiero. Considere un libro muy grande, como la Biblia. Un archivo contiene el texto completo de la Biblia, por lo que con la demostración, el resultado de buscar, por ejemplo, 'Damasco' apuntaría al archivo. Lo que me gustaría hacer es conservar el documento grande, pero las búsquedas arrojarán resultados que apunten a un Libro, Capítulo o incluso tan precisos como un Verso. Así que una búsqueda de 'Damasco' podría regresar (entre otros) Libro 23, Capítulo 7, Verso 8.

¿Es esto posible (y la mejor práctica en el uso de Lucene), o debería intentar seccionar el documento grande en muchos pequeños archivos para indexar?

Si hace alguna diferencia, estoy usando Java Lucene 2.9.0 y estoy indexando archivos HTML de aproximadamente 1MB - 4MB de tamaño. Que en términos de tamaño de archivo no es grande, pero es grande, en relación con una persona que lo lee.


No creo que haya explicado esto tan bien como pude. Aquí va para otro ejemplo.

Digamos que tomo mi archivo HTML grande, y (por los argumentos) el término de búsqueda 'Damasco' aparece 3 veces. Una vez en la línea 100 dentro de una etiqueta <div>, en la línea 2000 dentro de una etiqueta <p>, y en la línea 5000 dentro de una etiqueta <h1>. ¿Es posible indexar con Lucene, de modo que habrá 3 resultados, y pueden señalar el elemento específico dentro del término?

No creo que desee proporcionar un resultado de documento diferente para el término. Entonces, si el término 'Damasco' apareció dos veces dentro de un <div> específico, solo habría una coincidencia.

Parece de un comentario de Kragen que lo que me gustaría hacer es analizar el HTML cuando Lucene está pasando por la fase de indexación. Entonces puedo decidir el fragmento que quiero considerar como un documento de lo que lee el analizador. Entonces, si veo un div con cierta clase, puedo comenzar un nuevo documento de Lucene y se devolverá como un hit separado cuando se busque una palabra en el contenido de div.

¿Suena como lo que quiero hacer, y es posible?

Respuesta

1

Sí - Lucene registra el desplazamiento de los términos coincidentes en un archivo, por lo que puede utilizarse para determinar en qué parte del contenido indexado debe buscar las coincidencias.

Hay un complemento Lucene.Highlight que hace esta tarea exacta para usted - intente this article, también hay un par de preguntas sobre StackOverflow relacionadas con el resaltado de visitas (muchas de ellas están diseñadas para usar con aplicaciones web y también hacer cosas como que rodea las palabras que coinciden con <b> etiquetas)

ACTUALIZACIÓN: Dependiendo de cómo buscar en el índice que puede que encuentre que es una buena idea para dividir sus documentos grandes en secciones más pequeñas (por ejemplo, los capítulos), así - sin embargo, esto es más una pregunta sobre cómo desea organizar, priorizar y presentar sus resultados al usuario final.

Por ejemplo, supongamos que un usuario hace una búsqueda de "foo" y hay 2 libros que contienen ese término. El primer libro (libro A) puede contener 2 capítulos, cada uno de los cuales tiene muchas referencias a "foo", sin embargo, el término apenas se menciona en el resto del libro, sin embargo, el segundo libro (libro B) contiene muchas referencias a "foo" Sin embargo, están dispersos por todo el libro. Si indicas por libro, probablemente encontrarás que el libro B es el primero, sin embargo, indexando por capítulo es probable que encuentres que los 2 capítulos del libro A son los primeros 2 éxitos, seguidos de los capítulos del libro B.

Finalmente, obviamente, al usuario se le presentará 1 hit por documento coincidente que tenga en su índice - si desea presentar a sus usuarios una lista de libros coincidentes, obviamente índice por libro, sin embargo, puede ser más apropiado presentar al usuario una lista de capítulos coincidentes, en cuyo caso, obviamente, índice por capítulo.

+0

Usando su ejemplo, ¿puedo conservar el libro B como un solo archivo, en mi caso un archivo HTML, y crear varios documentos Lucene desde ese único archivo, de modo que todos los resultados del único archivo puedan ser informados al usuario como discretos? ¿golpes? ¿Es posible indexar por capítulo cuando los capítulos están en el mismo * archivo *? Gracias por su respuesta :) – Grundlefleck

+0

Puede indexar por capítulo al darle a Lucene solo un subconjunto de ese archivo cuando lo indexe; esto le dará 1 hit por cada capítulo coincidente. Si desea presentar al usuario un hit por coincidencia discreta, deberá buscar y encontrar todas las ocurrencias para cada documento coincidente: no hay forma de dividir un libro en suficientes documentos Lucene para que cada golpe garantizado corresponden a exactamente 1 ocurrencia de esa palabra/frase. – Justin

0

Una forma de hacerlo es crear varios documentos de un solo libro. Los documentos pueden representar libros, capítulos o versículos. Como el texto no necesita ser único, esto es lo que haría. De esta manera, el primer verso en el primer capítulo del libro de Génesis será indexado cuatro veces: en toda la Biblia, en el libro de Génesis, en el primer capítulo y como el versículo.

Una sutileza aquí es el objetivo exacto de la recuperación: ¿Quiere simplemente mostrar las palabras clave de búsqueda en contexto a un usuario? En este caso, considere usar un Lucene highlighter. Si necesita que la recuperación se use más (es decir, tomar el puntero recuperado a un capítulo o verso y hacer algún procesamiento en este lugar en el texto), iría con los documentos más detallados como describí anteriormente.

+0

El objetivo es proporcionar mostrar el HTML en una aplicación Swing, los resultados de búsqueda permitirán al usuario navegar a esa parte del HTML. La búsqueda también puede proporcionar una vista previa. Para ser claros, cuando dices 'crear varios documentos de un solo libro', ¿te refieres a los documentos de Lucene o a los nuevos? – Grundlefleck

+0

Me refiero a los documentos de Lucene. –

Cuestiones relacionadas