OpenCms + Lucene + Tildes

Wed May 26 17:45:00 CEST 2010       Sergio Raposo Vargas       Administración, OpenCms

Uno de los problemas que nos hemos encontrado cuando hemos intentado usar lucene con opencms es el encontrar un Analyzer para los caracteres especiales españoles como las tildes y ñ.

En principio la solución propuesta era usar el SnowballAnalyzer con el Stemmer = Spanish:

<analyzer>
                <class>org.apache.lucene.analysis.snowball.SnowballAnalyzer</class>
                <stemmer>Spanish</stemmer>
                <locale>es</locale>
</analyzer>

Bueno, hasta aquí parecía que todo era perfecto ya que las ñ y las tíldes dejaban de ser un problema. Pero el uso diario de esta herramienta dio con un nuevo error, las búsquedas de palabras con tilde y sin tilde daban resultados distintos. Es decir, si buscamos "documentación" no obteníamos los mismos resultados que si buscabamos "documentacion".

Si analizamos el buscador más extendido en nuestro país nos damos cuenta que para Google no existe diferencia entre buscar con y sin tildes. Y esto da que pensar, "si Google lo hace será por algo".

Dentro del análisis de este caso me di cuenta de una cosa curiosa, si haciamos la misma prueba con mayúsculas y minúsculas el resultado si era el mismo, es decir, entre mayúsculas lucene no distingue. Cada vez parece más claro que si no distinguimos entre mayúsculas y minúsculas, porque vamos a hacerlo con las tildes.

Pues consultado la documentación oficial de Lucene se comentaba que para añadir esta funcionalidad hay que aplicar un filtro a nuestro Analyzer, concretamente el ISOLatin1AccentFilter. Por defecto, el SnowballAnalyzer aplica 3 filtros: StandardFilter, LowerCaseFilter y StopFilter.Para aplicar un filtro a un Analyzer OpenCms no permite hacerlo desde el recurso de configuración opencms-search.xml (una posible mejora para la próxima versión no creéis?) sino que tenemos que irnos a código. Pues nada, eso hice, me descargue el código java de la clase, añadí el nuevo filtro, subí mi clase a OpenCms, modifiqué la configuración y reconstruí los índice de nuevo.

<analyzer>
                <class>com.saga.opencms.templatesaga.util.SnowballAnalyzer</class>
                <stemmer>Spanish</stemmer>
                <locale>es</locale>
</analyzer>

La clase me quedó tal que:

/** Constructs a {@link StandardTokenizer} filtered by a {@link
StandardFilter}, a {@link LowerCaseFilter} and a {@link StopFilter}. */
public TokenStream tokenStream(String fieldName, Reader reader) {
TokenStream result = new StandardTokenizer(reader);
result = new StandardFilter(result);
result = new LowerCaseFilter(result);
result = new ISOLatin1AccentFilter(result); // Mi cambio
if (stopSet != null)
result = new StopFilter(result, stopSet);
result = new SnowballFilter(result, name);
return result;
}
}

Y listo, ya tenemos una búsqueda a lucene que no depende si introducimos tildes o no en nuestras búsqueda. Si queréis probarlo podéis mirar en nuestra web de Template Saga y probar consultas como "documentación" y "documentacion" o "configuracion" y "configuración".

 

 OpenCms Lucene Tíldes SnowballAnalyzer ISOLatin1AccentFilter