h1

Sintaxis de la búsqueda en Lucene

15 diciembre 2008
Desde hace ya unos cuantos años, Lucene se ha convertido en el motor de búsqueda más utilizado en los proyectos de software libre, está integrado en gestores de contenido como OpenCms, gestores documentales como Alfresco y gestores de portales como Liferay. Cada vez va cobrando más y más fuerza desde su creación, la primera vez que yo lo usé en el 2005 estaba por la versión 1.* y ya va por la versión 2.4.0.
 
Además de tener la posibilidad de crear nuestras proprias consultas a través de su API, también nos proporciona un lenguaje de consultas a través de un parseador y un lexer que interpreta la cadena utilizando Lucene JavaCC.
 
Ya tiene unas cuantas herramientas entre las que destacamos Apache Solr y Luke Lucene, esté último nos facilitará mucho nuestra tarea, pues no proporciona una interfaz gráfica dónde podremos probar nuestras consultas.

A continuación explicaré un poco la sintaxis de la búsqueda en Lucene.

Lo primero que tenemos que saber es que una consulta se divide en los términos y los operadores, de forma individual o por frases. Un sólo termino seria «hola», y un grupo de términos o frases sería «hola Juan», para ello hay que delimitar la frase entre comillas dobles. 

A la hora de realizar la búsqueda, podemos indicarle a Lucene cuales son los campos en los que queremos que consulte, esto se haría separando los campos de la consulta mediante «:», es decir, nombre_campo:consulta.

Algunos de los caracteres especiales de Lucene son:

? :  Implicaría una coincidencia de cualquier cáracter. Por ejemplo, «hol?» nos devolvería cualquier palabra que empiece por «hol» seguida de cualquier cáracter. 

*: Implicaría la coincidencia múltiple de cualquier cáracter. Por ejemplo, «hol*» nos devolvería cualquier palabra que empiece por «hol» seguida de cualquier cosa.

Lucene también tiene la opción del uso de la lógica o Fuzzy logic, que se basa en el algoritmo de la búsqueda de  Levenshtein. Haciendo uso de, «~», al final de una sola palabra, por ejemplo, hola~, nos devolvería todas las palabras similares a hola.  También se le puede aplicar un parámetro entre 0 y 1 para indicar mayor o menor similitud: hola~0,8. Si no se le indica nada, toma por defecto el valor 0,5.

Así mismo, también tenemos la búsqueda por rangos que sería de la siguiente manera, fecha: [20020101  to  20030101]  Hay que tener en cuenta que las consultas Rango no están reservados para los campos de fecha. Este tipo de búsquedas no son sólo para fechas también se pueden hacer para palabras, titulo:{Aida TO Carmen}, que nos devolvería todos los documentos cuyos títulos están entre Aida y Carmen, pero sin incluir el Aida y Carmen.

Para darle relevancia a un término lo único que tenemos que hacer es ponerle ^, por ejemplo, hola^4, el valor no puede ser negativo aunque si puede ser menor que uno.

Se le pueden aplicar condiciones a las búsquedas mediante operadores booleandos como:

 «+»:  Indica que debe existir la palabra en el documento.

 OR: Indica la unión de los conjuntos de palabras, también se puede usar ||.

 NOT:  Indica que no debe existir la palabra en el documento.

«-«: Indica que no debe existir en el documento el conjunto de palabras.

AND: Indica la unión de los conjuntos de palabras.

Estas son algunas de las características básicas de la sintaxis de búsqueda de Lucene, espero que haya sido útil.

Un saludo.

13 comentarios

  1. Que dolores de cabeza nos dio esto en su dia jejeje.


    • Más de uno, nos costó dominar la cosa e integrarlo con OpenCms, pero lo conseguimos….lucenito, lucenito….


  2. Hola.
    Estoy buscando información acerca de Lucene 2.4.
    He intentado probar algunos ejemplos como los del libro Lucene in Action o el luceneweb.war pero ambos me dan errores o métodos «deprecated». Buscando el por que de los deprecated he visto en otras pags, foros y en el API de Lucene 2.4 que hay métodos que han pasado a ser obsoletos casualmente muchos de los que me marca como error el eclipse…habría que sustituir todos los métodos deprecated por otros mas nuevos?
    ¿Sabría alguien como solucionar los problemas que tengo ? ¿Alguien me puede decir donde conseguir un ejemplo en Lucene 2.4 en zip o .war para ver la «nueva sintaxis»? GRACIAS por adelantado. Saludos


  3. Hola Alejandro.
    GRACIAS por tu rápida respuesta. Ambos enlaces ya les había echado un ojo (de hecho en el primero de ellos también he escrito para ver si me podían solucionar mi problema)asique no se muy bien como solucionar-cambiar estos métodos deprecated.
    ¿De que trata tu artículo de lucene 2.4? Estoy deseoso de leerlo que se agradece leer de vez en cuando información bien explicada en español y ya de paso comprobar si me puede solucionar mi problema.
    Si tienes algun ejemplo tipo holamundo pero en Lucene se agradecería poderle echar un ojo poruqe la verdad es que estoy atascado.
    Saludos


    • Buenas,
      De momento me estaba documentando, ya te digo, estoy muy liado y tengo esto un poco abandonado, cuando saque tiempo y lo termine. Te avisaré.
      Un saludo


  4. Antes que nada, saludos me parece que lucene es una herramienta poderosa pero tal vez sea demasiado engorrosa
    Buen material, pero me surge una duda
    si el operador «-» indica que la palabra no se debe encontrar y busco
    HEWLETT-PACKARD por ejemplo, esto me traería los registros que tienen HEWLETT pero no deben contener PACKARD, como le haría si quiero que busque HEWLETT-PACKARD con todo y el guión?


    • Buenas,
      Lo que debes hacer es usar el caracter de escape «\»
      Un saludo


  5. Hola Alejandro
    He ido avanzando muy poco a poco en mis progresos de Lucene (que por cierto veo que es bastante amplio pero a la vez MUY INTERESANTE) y tras conseguir hacer un ejemplo muy sencillo de indexacion me surgen dudas en la búsqueda.

    Cree un indice p por lo que tengo 4 «ficheros Lucene» en donde el indice p contiene HOLA, HOLA PAPA, ADIOS y ADIOS PAPA me sucede lo siguiene:
    – Si pongo HOLA* SI me encuentra los 2 ficheros.
    – Si pongo HOLA P* NO me lo encuentra puesto que la query es: query: p:hola p:p*
    – Si pongo HOLA PAPA NO me lo encuentra puesto que la query es: query: p:hola p:papa

    ¿Como habría que expresarlo para que si busco HOLA me saque q existe en 2 ficheros (el de HOLA PAPA y el de HOLA)? Se me ocurre añadir * a todo detras de la cadena que busco pero me parecería bastante «cutre».
    ¿Y si pongo PAPA q me diga que sale en otros 2 (HOLA PAPA y ADIOS PAPA)? Pq la opción de hacer la query como *PAPA* no he conseguido hacerla…por lo que no sabría como hacerlo.

    Espero que tu tb estés avanzando en tus conocimientos de Lucene…la verdad que para lo poco que lo he visto me ha parecido BASTANTE INTERESANTE.

    Espero tu respuesta y espero que sirva de ayuda como todo lo que por ahora me has proporcionado.

    Saludos


    • Buenas,
      Perdona que te haya tardado en responder, pero es que he estado de viaje.
      Te comento, si quieres buscar dos palabras debes poner AND o OR dependiendo de si las quieres las dos juntas o una de las dos.
      Un saludo


  6. Muy buenas Alejandro¡¡ Soy compi del foro de opencmsHispano, jejej.
    Tengo una duda con respecto a esto. Las condiciones que puedes conjugar.. las metes dentro de la variable query??

    Puede poner algún ejemplo? es que me da error…

    mi codigo:

    String query = «Date:[» + fecha1 + » to «+ «fecha2]»;

    search.setQuery(query);

    «Date» lo he generado en la configuracion de campos del índice, desde la administracion de opencms.

    es asi???


    • uhmmmm, hazte la idea de que la cadena query está bien construida. Me he equivocado, sorry.

      String query = “Date:[» + fecha1 + » to «+ fecha2 + «]“;

      asi mejor


  7. Gracias por tu articulo!!
    De lo mejor que he leido.
    Saludos



Deja un comentario