martes, marzo 04, 2008

Aprovechando Lucene en memoria

martes, marzo 04, 2008 por Martín


Ya estoy de vuelta de estas mini vacaciones. Que bonita estaba Galicia, y más si tienes la suerte de ir a una boda en un pazo en Silleda, que no le tiene nada que envidiar a Irlanda.

En fin, que tenía pendiente postear sobre algo en lo que he estado trabajando en los últimos días, que no es nada complejo pero es algo que al menos yo no conocía: El utilizar Lucene en memoria

¿Por qué habríamos de querer hacer algo así? Pues bien, Lucene es una de las mejores librerías Open Source que pueden existir. Además tiene una cantidad de proyectos satélite que de por sí los hace muy interesantes para su uso en nuestras propias aplicaciones.

Muchas veces, los que hemos trabajado bastante con Lucene nos dábamos cuenta de que había ciertas funcionalidades que sería realmente útil para nuestras aplciaciones. Por ejemplo, para ejecutar algoritmos de stemming sobre textos, o quizás para simplemente filtrar stop words, o buscar con soporte de sinónimos, etc. El problema, era que para hacer esto necesitabas tener un índice de Lucene en disco con las desventajas que esto conllevaba.

Crear un índice de Lucene en memoria es algo tan sencillo como esto (me disculpáis que me coma los imports):

RAMDirectory idx = new RAMDirectory();
Analyzer analyzer = new SnowballAnalyzer("Spanish",SpanishAnalyzer.getStopWords());
IndexWriter writer = new IndexWriter(idx, analyzer, true);


(En este caso, la clase SpanishAnalyzer es propia, pero podéis utilizar cualquier analyzer ahí)

Ahora se podrían crear documentos y añadirlos al índice:

Document doc = new Document();
doc.add(new Field("id","abcde",Field.Store.YES,Field.Index.NO));
doc.add(new Field("text","esto es un texto de prueba",Field.Store.YES,Field.Index.TOKENIZED));
writer.addDocument(document);


Y por supuesto, hacer búsquedas:

Searcher searcher = new IndexSearcher(idx);
QueryParser parser = new QueryParser("text",analyzer);
Query query = parser.parse(text);
// Search for the query
Hits hits = searcher.search(query);


Sencillo y poderoso. Me encanta Lucene.

comments

4 Respuestas a "Aprovechando Lucene en memoria"
Daniel dijo...
12:27

Totalmente de acuerdo en que Lucene es un proyecto estupendo que hace facil una cosa bastante compleja y se agradece mucho.

Yo solo le pongo un pero. La documentacion es terrible, terrible. Una vez has conseguido averiguar "de que va el tema", realmente no hay tantos problemas a no ser que quieras hacer cosas muy complejas, pero la barrera inicial de utilizacion esta muy alta por la cantidad de documentacion obsoleta, ejemplos parciales y simplemente cosas que faltan...

El ultimo ejemplo que me encontré. Si haces busquedas "parciales", con * o ?, se pasa por el forro tu Analyzer asi que si al indexar usas un Analyzer, como haces tu en el ejemplo, te puedes llevar unas sorpresas muy desagradables :(. La solucion parcial, no puedes usar StopWords, es usar un QueryBuilder especial que hasta sale en el API, pero si lo buscas en el JAR de Lucene.... no esta!

Ains!


Martín dijo...
20:28

Creo que ahí te has expresado mal, porque he entendido perfectamente tu comentario y sé lo que quieres decir.

No es que la barrera inicial sea muy alta. En mi opinión es al contrario. La barrera inicial es bastante baja, como muestra el código que he puesto. Sin embargo, pasa lo mismo que pasa con otros muchos proyectos Open Source (en general los que no están financiados), y es que la documentación suele ser pobre, y una vez que te apartas del "camino feliz" como bien comentas empiezas a sufrir y a encontrate con los efectos inesperados, con la falta de soluciones y con el tener que navegar tu mismo en el código fuente.


Daniel dijo...
8:48

Es que para mi que la pobre documentacion, ejemplos obsoletos que no funcionan etc. es la barrera inicial.
Conozco varios desarrolladores que podrian haber usado Lucene en sus aplicaciones y les hubiera ido como anillo al dedo, pero al empezar con el tema se les pusieron los pelillos de punta e huyeron despavoridos :).

No todo el mundo esta acostumbrado a bregar con OS.

Eso si, estoy totalmente de acuerdo contigo que una vez pasada la fase del "susto", la cosa es sencillisima para el poder que te da. Supongo que es unicamente cuestion de a que llamas "barrera inicial" ;).

PD: Si alguno despues de esto se quiere animar, recomendaria acudir, por ejemplo, al libro "Lucene in Action", ya que sólo por web se hace bastante duro.


javier dijo...
17:02

Buenas, hemos empezado a usar Lucene para un foro y tenemos un problema al recrear los índices para las búsquedas. Explico lo que nos pasa por si os ha pasado o sabéis por donde va el tema.
Creo un comentario en el foro (por ejemplo pongo "Lunes"), luego hago una búsqueda en el foro de Lunes y me aparece la entrada.
Recreo los índices, hago una nueva búsqueda de Lunes y ya no me encuentra nada.
Siempre que recreo los índices, me pierde los índices anteriores.

Alguien tiene alguna idea??

Muchas gracias de antemano