Fórumok

Liferay 6.1.x - Lucene 3.0.3 no trae SpanishAnalyzer

thumbnail
Sergio Romero Zayas, módosítva 10 év-val korábban

Liferay 6.1.x - Lucene 3.0.3 no trae SpanishAnalyzer

Regular Member Bejegyzések: 151 Csatlakozás dátuma: 2008.04.14. Legújabb bejegyzések
Buenas tardes.

La verdad es que llevo 2 días rebuscando en las entrañas de este foro y no encuentro na de na. El problema es el siguiente. Usando el buscador de Liferay, cuando realizas una búsqueda de-> camion y otra con la palabra camión. Los resultados son diferentes.

Motivo-> Liferay 6.1.x usa una versión de Lucene bastante antigua, la 3.0.3. Esta versión no contempla el analizador SpanishAnalyzer.

En anteriores versiones de Liferay, era posible usar la propiedad lucene.analyzer para indicarle cual era tu analizador. En la versión 6.1.x esta propiedad ni existe.

¿Así que como soluciono esto?

He probado varias cosas, y ninguna me ha dado resultado.

Lo primero ha sido, ir un poco a lo "bestia", he intentado cambiar las librerías de Lucene 3.0.3 a la 3.1.0 que es la versión más cercana con SpanishAnalyzer. Evidentemente la dependencia de Liferay con Lucene es tan fuerte, que un cambio de versión lo "revienta".

Siguiente idea, intentar meterle solo la clase SpanishAnalyzer. Pues tampoco funciona, porque en el xml donde definen los bean, este no existe, además de que no encuentro la forma de indicarle a Liferay que quiero que use este SpanishAnalyzer.

En fin estoy bastante ofuscado y bloqueado. Alguien a tenido este problema, en la versión 6.1?
thumbnail
Alfredo Del Castillo Villalba, módosítva 10 év-val korábban

RE: Liferay 6.1.x - Lucene 3.0.3 no trae SpanishAnalyzer

New Member Bejegyzések: 13 Csatlakozás dátuma: 2012.04.24. Legújabb bejegyzések
Buenas Sergio!

Aunque oficialmente no tienes esa opción de usar el SpanishAnalyzer (al menos para la versión 6.1) si puedes seguir usando ese proceso que mencionas para versiones anteriores. En concreto podrías hacer lo siguiente:
1 - Definir una clase que extienda el analizador de tu elección y que devuelva una cadena de filtros adecuada, extendiendo de StandardAnalyzer por ejemplo.
2 - Utilizar esa clase definida en el paso anterior como analizador. Esto se define en el archivo search-spring.xml. Podrías optar por usarla como analizador por defecto o bien como analizador específico para los campos explícitamente nombrados como pertenecientes al idioma español.
3 - En ambos casos sería necesario definir el bean "com.test.MyAnalyzer" del tipo MyAnalyzer definido en el paso 1. Por ejemplo si optaste por la segunda opción tendrías algo parecido a esto
<bean id="com.liferay.portal.search.lucene.PerFieldAnalyzerWrapper" class="com.liferay.portal.search.lucene.PerFieldAnalyzerWrapper">
		<constructor-arg>
			<ref bean="org.apache.lucene.analysis.standard.StandardAnalyzer" />
		</constructor-arg>
		<constructor-arg>
			<util:map map-class="java.util.LinkedHashMap">
				<entry key=".*_es" value-ref="com.test.MyAnalyzer" /></util:map></constructor-arg></bean>

3 - Reindexar todo el portal
4 - Probar búsquedas con y sin tilde.

Resumiendo un poco todo, el proceso que describes para versiones anteriores a la 6.1 sigue disponible, pero usando el fichero search-spring.xml, que es donde se encuentran estas definiciones actualmente.

¡Espero que te sirva! Un saludo.
thumbnail
Sergio Romero Zayas, módosítva 10 év-val korábban

RE: Liferay 6.1.x - Lucene 3.0.3 no trae SpanishAnalyzer

Regular Member Bejegyzések: 151 Csatlakozás dátuma: 2008.04.14. Legújabb bejegyzések
Esto que comentas, es lo que estoy intentando hacer, pero no sé como "decirle" a Liferay que mi SpanishAnalyzer sea el que debe usar por defecto. En versiones anteriores de Liferay bastaba con poner la clase en el properties. Ahora tengo que bajarme el código fuente completo de Liferay, tocar el search-spring.xml del META-INF, y generar el portal-impl.jar de nuevo. Esto último no me parece para nada elegante, me parece más una carencia de Liferay.

Voy al grano.

Yo tengo la clase SpanishAnalyzer, que no se encuentra en la versión de Lucene que usa Liferay, ya que la que usa es justo la última que no lo incluye. Así que:
¿Debo incluir esta clase mediante una extensión, o puedo hacerlo con un hook?
Una vez incluida la clase, ¿puedo realizar un hook del fichero search-spring.xml, o es necesario generar el portal-impl.jar?

Gracias por la ayuda Alfredo, la verdad que algo tan simple me esta dando verdaderos dolores de cabeza, cuando se supone que si vamos a versiones nuevas esto debería incluso simplificarse.
thumbnail
Alfredo Del Castillo Villalba, módosítva 10 év-val korábban

RE: Liferay 6.1.x - Lucene 3.0.3 no trae SpanishAnalyzer

New Member Bejegyzések: 13 Csatlakozás dátuma: 2012.04.24. Legújabb bejegyzések
No hay de que, al revés a ver si te sale y ya sabes, en el marketplace tendría tirón emoticon

En principio yo creo que con un proyecto ext podrías hacerlo sin necesidad de compilar nada del código de Liferay, ahora mismo no te lo puedo comprobar pero echale un ojo desde el Liferay IDE porque no tengo entendido que sea un proceso complicado (de empezar, luego eso sí tienes que poner ese analizador personalizado).

Un saludo.
thumbnail
Sergio Romero Zayas, módosítva 10 év-val korábban

RE: Liferay 6.1.x - Lucene 3.0.3 no trae SpanishAnalyzer

Regular Member Bejegyzések: 151 Csatlakozás dátuma: 2008.04.14. Legújabb bejegyzések
He intentado por todos los medios hacer esto con una extensión y al menos yo, no lo he conseguido. No digo que sea imposible, pero el fichero spring-search.xml se lo pasa por el "forro".

No me ha quedado otra que tratar de meterle mano al core, cosa que se me esta haciendo cada vez más "dolorosa" ya que hay mucho trasteo de Liferay y Lucene entre medias, y ni forzando el que pille mi clase lo consigo.

Tengo una pregunta, por si algún alma caritativa pudiera responder. ¿Solucionaría mi problema poniendo un SOLR? Yo pienso que si, pero ya instalé otras veces SOLR y sé de su complejidad para hacerlo funcionar, así que antes de perder más tiempo, me gustaría si alguien que haya tenido este problema, lo ha afrontado así.

En fin espero comentarios, ideas,... AYUDA! Please!

PD. Disculpen el tono de desesperación.. ;)

Que la fuerza os acompañe.
thumbnail
Daniel Sanz, módosítva 10 év-val korábban

RE: Liferay 6.1.x - Lucene 3.0.3 no trae SpanishAnalyzer

Regular Member Bejegyzések: 143 Csatlakozás dátuma: 2010.12.14. Legújabb bejegyzések
Sergio Romero Zayas:
Esto que comentas, es lo que estoy intentando hacer, pero no sé como "decirle" a Liferay que mi SpanishAnalyzer sea el que debe usar por defecto. En versiones anteriores de Liferay bastaba con poner la clase en el properties. Ahora tengo que bajarme el código fuente completo de Liferay, tocar el search-spring.xml del META-INF, y generar el portal-impl.jar de nuevo. Esto último no me parece para nada elegante, me parece más una carencia de Liferay.


Liferay 6.1 permite definir analizadores diferentes por cada campo del documento que se indexa. Esto trae grandes ventajas ya que permite tokenizar/post-procesar de diferente modo según se trate por ejemplo de un campo que guarde el título de un documento o el valor de un contenido web. Con el crecimiento en los elementos internacionalizados, ocurre que Liferay indexa el valor de un campo del modelo de datos en múltiples campos Lucene cuyo sufijo es el locale correspondiente.

Lógicamente, emplear un único analizador para todos esos campos (en particular, si se trata de campos localizados) no es funcional en absoluto. Puedes encontrar más detalles en http://issues.liferay.com/browse/LPS-16895

Como consecuencia de esta nueva funcionalidad, la configuración se movió a un descriptor spring.

No es necesario regenerar el portal-impl.jar. Cualquier descriptor de spring ubicado en WEB-INF/classes/META-INF será leido en sustitución del empaquetado en portal-impl.jar.

Sergio Romero Zayas:

Yo tengo la clase SpanishAnalyzer, que no se encuentra en la versión de Lucene que usa Liferay, ya que la que usa es justo la última que no lo incluye. Así que:
¿Debo incluir esta clase mediante una extensión, o puedo hacerlo con un hook?
Una vez incluida la clase, ¿puedo realizar un hook del fichero search-spring.xml, o es necesario generar el portal-impl.jar?


No es recomendable mezclar clases de diferentes versiones de una librería. El enfoque que te propone Alfredo es equivalente a lo que buscas, pero el analizador lo defines en una nueva clase Java a partir de elementos existentes en los jars empaquetados con Liferay. En concreto, debería ser suficiente con añadir el ASCIIFoldingFilter al stream de tokens del StandardAnalyzer. La versión funcional de com.test.MyAnalyzer son 15 líneas de código. Esa clase sí debe incluirse como parte de un ext. Dado que dicho ext sólo añadiría nuevas clases, puedes usar un ciclo corto de despliegue copiando la clase compilada en WEB-INF/classes y reiniciando el servidor.

Sergio Romero Zayas:

Gracias por la ayuda Alfredo, la verdad que algo tan simple me esta dando verdaderos dolores de cabeza, cuando se supone que si vamos a versiones nuevas esto debería incluso simplificarse.


No necesariamente. El aumento en nuevas funcionalidades trae consigo mayor complejidad en la configuración "de bajo nivel", es decir, la que no está al alcance de los usuarios del portal sino de los que desarrollan proyectos sobre Liferay. Si mueves la complejidad fuera de la configuración, la tienes que situar en otro lugar (clases Java por ejemplo?) con lo cual escondes el problema. La configuración de beans de spring te evita precisamente eso.

Espero que te sirva de ayuda!
Un saludo
thumbnail
Sergio Romero Zayas, módosítva 10 év-val korábban

RE: Liferay 6.1.x - Lucene 3.0.3 no trae SpanishAnalyzer

Regular Member Bejegyzések: 151 Csatlakozás dátuma: 2008.04.14. Legújabb bejegyzések
Voy a darle una nueva vuelta Daniel. Muchas gracias por tu rápida y detallada respuesta.

El meter la "zarpa" en el core de Liferay nunca me ha entusiasmado, pero al ver que mis modificaciones en el spring-search.xml usando el ext no las cogía... la desesperación te lleva a lo que te lleva..

Voy a intentar hacer esto que comentas de añadir el ASCIIFoldingFilter al stream de tokens de StandardAnalyzer, a ver si veo la luz. Lo dicho gracias por la respuesta.
thumbnail
Sergio Romero Zayas, módosítva 10 év-val korábban

RE: Liferay 6.1.x - Lucene 3.0.3 no trae SpanishAnalyzer

Regular Member Bejegyzések: 151 Csatlakozás dátuma: 2008.04.14. Legújabb bejegyzések
Acabo de realizar lo aconsejado y nada..., que no consigo que esto funcione, no me da ningún error, pero tampoco para en los breakpoints cuando le hago un debug, lo que puede ser señal de que no está extendiendo y que sigue prevaleciendo el search-spring.xml de Liferay sobre el que intento sobre-escribir con en el ext.

No sé que estaré haciendo mal, seguro que muchas cosas, pero bueno ahí van mis pruebas;

Me he creado mi proyecto EXT, haciendo uso del plugin de Liferay para Eclipse, o Liferay IDE como muchos decimos. A este proyecto le he llamado spanish-analyzer-ext.

En el proyecto he creado 2 clases en --> "/spanish-analyzer-ext/docroot/WEB-INF/ext-impl/src"
La primera:

package com.spanish.analyzer;

import java.io.Reader;

import org.apache.lucene.analysis.ASCIIFoldingFilter;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.util.Version;

public class SpanishAnalyzer extends StandardAnalyzer {

	public SpanishAnalyzer(Version matchVersion) {
		super(matchVersion);
		
	}

	@Override
	public TokenStream tokenStream(String fieldName, Reader reader) {

		TokenStream result = super.tokenStream(fieldName, reader);

		result = new ASCIIFoldingFilter(result);

		return result;
	}

}

y la segunda para pasarle también el ASCIIFoldingFilter al KeywordAnalyzer


package com.spanish.analyzer;

import java.io.Reader;

import org.apache.lucene.analysis.ASCIIFoldingFilter;
import org.apache.lucene.analysis.KeywordAnalyzer;
import org.apache.lucene.analysis.TokenStream;

public class SpanishKeywordAnalyzer extends KeywordAnalyzer {
   
    public SpanishKeywordAnalyzer() {
    	super();
	}

    public final TokenStream tokenStream(String fieldName, Reader reader) {
       
        TokenStream result = super.tokenStream(fieldName, reader);
       
        result = new ASCIIFoldingFilter(result);
       
        return result;
    }   
}


Después en "/spanish-analyzer-ext/docroot/WEB-INF/ext-web/docroot/META-INF" meto el descriptor "search-spring.xml"

En este fichero añado varias líneas.
En la zona de "Lucene analyzers" añado el key entry:

<entry key=".*_es_ES" value-ref="com.spanish.analyzer.SpanishAnalyzer" />

Algo más abajo añado el bean justo antes del StandardAnalyzer

<bean id="com.spanish.analyzer.SpanishAnalyzer" class="com.spanish.analyzer.SpanishAnalyzer">
		<constructor-arg ref="org.apache.lucene.util.Version" />
</bean>


Tras todo esto, se supone que el fichero "search-spring.xml" debería prevalecer sobre el que existe en el interior de "portal-impl.jar", pero no es así. He realizado varias pruebas, incluso forzando que el bean con id StandardAnalyzer haga referencia a mi clase SpanishAnalyzer, en ambos casos es ignorado.

He posteado todo esto, en primer lugar para ordenar las acciones que he ido realizando, pero sobre todo por si estoy haciendo algo mal (seguramente), pero de lo obvio que es no lo veo.

Espero vuestra ayuda como agua de mayo, aunque estemos en Septiembre.

Gracias de antemano y que la fuerza os acompañe.
thumbnail
Sergio Romero Zayas, módosítva 10 év-val korábban

RE: Liferay 6.1.x - Lucene 3.0.3 no trae SpanishAnalyzer

Regular Member Bejegyzések: 151 Csatlakozás dátuma: 2008.04.14. Legújabb bejegyzések
Acabo de probar esto mismo, pero modificando el fichero "search-spring.xml" de dentro del "portal-impl.jar" y si me coge el fichero, con lo que seguro que no estoy haciendo bien la extensión de este fichero en mi proyecto.

¿podrían decirme como puede extender este fichero?

Gracias a todos por la ayuda, al menos la luz ya esta al final del túnel emoticon Cuando todo este solucionado prometo un post con la solución y tal vez como dice Alfredo suba algo al marketplace ;)

ME EDITO A MI MISMO.

Estaba ubicando mal el fichero search-spring.xml

Al crear el proyecto ext en Eclipse, el plugin de Liferay genera las carpetas y ficheros mínimos para este tipo de proyectos, con lo que te facilita mucho la labor. Al observar una carpeta "META-INF" que te genera el propio plugin, por inercia coloque el fichero "search-spring.xml" en ese lugar, cosa que hacía que no funcionara la extensión.

Me di cuenta de que no estaba haciendo algo bien al redactar uno de mis anteriores comentarios, porque enumeré todos los pasos y aparentemente era justa la solución, pero al ver que estaba todo aparentemente correcto, me fui a la documentación y al releer la documentación de Liferay me di cuenta de mi error. Estaba ubicando mal el fichero "search-spring.xml". Así que su ubicación correcta era /spanish-analyzer-ext/docroot/WEB-INF/ext-impl/src/META-INF/search-spring.xml

Con esto se soluciona el problema de las tildes para los españoles, y abre una ventana para el resto de idiomas problemáticos no soportados por defecto.

Pueden ver la documentación que he leído aquí --> Liferay Portal 6.1 - Development Guide

Gracias a todos los que me habéis ayudado en este post.
thumbnail
Juan Fernández, módosítva 10 év-val korábban

RE: Liferay 6.1.x - Lucene 3.0.3 no trae SpanishAnalyzer

Liferay Legend Bejegyzések: 1261 Csatlakozás dátuma: 2008.10.02. Legújabb bejegyzések
Hola Sergio:
Dos propuestas, a ver si alguna de las dos funciona.
1) Yo probaría a meterle mano a ext-spring.xml, que tiene pinta de que sirve para eso

2) O tal vez simplemente cambiando en tu portal-ext.properties la propiedad "spring.configs" para que llame a tu fichero de configuración en lugar del original hace el truco.


 spring.configs=\
        META-INF/base-spring.xml,\
        \
        META-INF/hibernate-spring.xml,\
        META-INF/infrastructure-spring.xml,\
        META-INF/management-spring.xml,\
        \
        META-INF/util-spring.xml,\
        \
        META-INF/editor-spring.xml,\
        META-INF/jcr-spring.xml,\
        META-INF/messaging-spring.xml,\
        META-INF/scheduler-spring.xml,\
[b]        META-INF/search-spring.xml,\[/b]
        \
        META-INF/counter-spring.xml,\
        META-INF/document-library-spring.xml,\
        META-INF/lock-spring.xml,\
        META-INF/mail-spring.xml,\
        META-INF/portal-spring.xml,\
        META-INF/portlet-container-spring.xml,\
        META-INF/wsrp-spring.xml,\
        \
        META-INF/mirage-spring.xml,\
        \
        #META-INF/dynamic-data-source-spring.xml,\
        #META-INF/shard-data-source-spring.xml,\
        \
        META-INF/ext-spring.xml,\
        META-INF/myext-spring.xml


Ya nos contarás
Suerte
Juan
thumbnail
Sergio Romero Zayas, módosítva 10 év-val korábban

RE: Liferay 6.1.x - Lucene 3.0.3 no trae SpanishAnalyzer

Regular Member Bejegyzések: 151 Csatlakozás dátuma: 2008.04.14. Legújabb bejegyzések
jejeje Llegas tarde Juan, ya lo arreglé, el fallo era que no ubicaba bien el fichero search-spring.xml.

Era mucho más fácil, solo tenía que releer esto:

To customize the Lucene analyzer configuration, you must create an Ext plugin. The Analyzer classes reference the Lucene APIs directly, so it’s not possible to configure Lucene analyzers from a hook plugin. In your Ext plugin, create a /docroot/WEB-INF/ext-impl/src/META-INF/ext-spring.xml file and declare the beans you’ll override with a custom configuration.


Para comprender que estaba ubicando mal el fichero search-spring.xml.

Gracias de todos modos Juan, gracias a ti y a todos los que hacéis que guste trabajar con Liferay.

que la fuerza os acompañe.
thumbnail
Sergio Romero Zayas, módosítva 10 év-val korábban

RE: Liferay 6.1.x - Lucene 3.0.3 no trae SpanishAnalyzer

Regular Member Bejegyzések: 151 Csatlakozás dátuma: 2008.04.14. Legújabb bejegyzések
Lo prometido es deuda.

Un post con un resumen de todo esto, en español, para ayudar a quien le pueda venir bien:

Añadir analyzer español para Liferay 6.1.x - Como hacerlo fácil emoticon




que la fuerza os acompañe emoticon
thumbnail
Sergio Romero Zayas, módosítva 10 év-val korábban

RE: Liferay 6.1.x - Lucene 3.0.3 no trae SpanishAnalyzer

Regular Member Bejegyzések: 151 Csatlakozás dátuma: 2008.04.14. Legújabb bejegyzések
Pues vuelta a la carga...

El problema después de todo, persiste en parte. Cuando lo que buscamos es un documento de "Documentos y Multimedia" (pdf, doc, etc) no usa el spanishAnalizyer. ¿porque? Indexar, supongo que indexa bien porque el problema que tenía con los contenidos ya no lo tengo, pero con los documentos sí que lo tengo.

¿Hace el portlet buscador de Liferay, algún tipo de discriminación en el buscador cuando se trata de documentos?
Juan Antonio Girón, módosítva 9 év-val korábban

RE: Liferay 6.1.x - Lucene 3.0.3 no trae SpanishAnalyzer

New Member Bejegyzések: 15 Csatlakozás dátuma: 2012.02.10. Legújabb bejegyzések
Buenas tardes Sergio, como he podido comprobar en este hilo te has "peleado" y mucho con el asunto del SpanishAnalyzer.
Por favor, ¿podrías explicarme cómo implementarlo en Liferay 6.0.5?

La idea es definir en el portal-ext.properties el Analyzer a usar, ¿no es así?

Gracias.