A continuación, un ejemplo de indexación y búsqueda con Lucene. Vemos primero los diagramas de clase y de flujo.

Diagrama de clases:


Diagrama de flujo: indexación de ficheros.




Diagrama de flujo: búsqueda de ficheros.



Indexar documentos XML

Para indexar documentos XML no necesitamos ninguna herramienta ni API especial. La API de Java trae incluido un analizador sintáctico (parser) de XML. Simplemente tenemos que importar lo siguiente:

import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

El uso de estas bibliotecas se puede ver en sucesivos post, en el código de ejemplo.

Hay muchas otras opciones para extraer XML, en este ejemplo se ha optado por la simplicidad. Lo que se lleva a cabo es extraer el contenido del fichero XML completo como texto plano e indexarlo.

No es la mejor opción, puesto que el contenido de muchas etiquetas está repetido y no es necesario. Para realizar un buen análisis de un documento XML genérico habría que utilizar por ejemplo, las funciones de XPath.

Otra opción válida si el documento XML no es genérico, sino que está bien definido es realizar una extracción del contenido sabiendo los nombres de las etiquetas principales (ver ejemplo de extracción de XML).

Utilizaremos el analizador desarrollado por Apache-POI, que nos permitirá analizar sintácticamente  documentos Word de Office 97, 2000 y XP. Los documentos de Office 2007 no son por el momento compatibles.

El procedimiento para hacerlo es el siguiente:

  • Descargamos los ficheros de la web de Apache-POI, buscaremos una versión estable (FINAL).
  • Descomprimimos el fichero. Buscamos en el archivo descomprimido y encontraremos unos ficheros .JAR.
  • Añadimos estos ficheros al classpath de el IDE que utilicemos y el uso es inmediato al igual que en el caso de los PDF.
Ejemplos de código más adelante.

Indexar documentos PDF

Para indexar documentos PDF tenemos varias alternativas:

Se puede usar PDFBox, una API hecha en Java que permite el acceso al contenido textual de un PDF. PDFBox incluye la integración con Lucene para traducir un PDF a un documento Lucene.

Para usar PDFBox, lo descargamos de la web (http://pdfbox.org/), lo descomprimimos y añadimos el fichero/s .JAR al classpath.

Esta es la opción que se eligió para la clase de prueba de ejemplo (ver código) a continuación.

Otras soluciones para indexar PDF pueden ser:

·XPDF (http://www.foolabs.com/xpdf/): herramienta de código abierto con licencia GPL. No es una herramienta de Java, pero hay una utilidad llamada pdftotext que puede traducir documentos PDF a documentos de texto en la mayoría de las plataformas desde la línea de comandos.

Basado en xpdf, existe una utilidad llamada pdftohtml (http://pdftohtml.sourceforge.net/) que puede traducir documentos PDF a documentos HTML. Igualmente no es una aplicación Java.

Jpedal (http://www.jpedal.org/) es una API de Java para extraer texto e imágenes de los documentos PDF. 

Indexar documentos RTF

Para realizar la indexación de los documentos RTF utilizaremos una biblioteca incluida en Java, llamada RTFEditorKit, la cual nos servirá para extraer el texto plano de los documentos. Al igual que en la indexación de documentos TXT, no hay que hacer uso de otra herramienta adicional.

A pesar de esto, es posible que este editor/extractor de tokens no sea 100% efectivo, ya que hay se han detectado algunos errores por omisión de palabras en la indexación.

Código de ejemplo de uso:

FileInputStream is = new FileInputStream(f); //Tomamos de Stream
RTFEditorKit kit = new RTFEditorKit();
javax.swing.text.Document d = kit.createDefaultDocument();
kit.read(is, d, 0);
String texto = d.getText(0, d.getLength());
        
Document doc = new Document();
doc.add(new Field("filename", f.getCanonicalPath(), Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("contents", texto, Field.Store.YES, Field.Index.ANALYZED));
is.close();
writer.addDocument(doc);


Indexar documentos TXT

Realizar la indexación de documentos de texto plano (txt) con Lucene es muy sencillo en la versión de Lucene original (Java) ya que usa las funciones predefinidas de entrada/salida de Java, simplemente hay que incluir la biblioteca java.io.

Un ejemplo de cómo sería el código:

Document doc = new Document();
Reader r = new FileReader(f);
       
doc.add(new Field("contents", r));
doc.add(new Field("filename", f.getAbsolutePath(), Field.Store.YES, Field.Index.ANALYZED));

       
writer.addDocument(doc);


Como Lucene sólo trabaja con texto plano, para indexar otro tipo diferente de fichero, habrá que hacer una preparación previa para obtener el texto a partir de ellos. Esto se lleva a cabo utilizando distintos tipos de herramientas.

A continuación, repartido en diferentes post, iremos explicando la extracción de texto plano para una serie de documentos específicos, comenzando por los documentos .txt que son los más sencillos de indexar, para posteriormente estudiar cómo trabajar con otro tipo de documentos (.PDF, .XML, ...).

Todo esto será siempre utilizando Java y la herramienta requerida para la extracción del texto plano en cada caso.

Entradas antiguas