Query Lucene compleja

cancel
Showing results for 
Search instead for 
Did you mean: 
jjhinojosa
Member II

Query Lucene compleja

Hola a todos, quiero hacer una query para buscar por name o description, y que sea de un tipo, eso es fácil, pero es que también quiero que el patrón de búsqueda lo compare con las propiedades de un elemento asociado a ese tipo, es decir, quiero que me encuentre cualquier contenido de un determinado tipo cuyo nombre o descripción coincida con el patrón de búsqueda, o que alguna propiedad de algún elemento asociado a él coincida con el patrón. Más o menos sería así:
TYPE:"mi:tipo" AND ( @cm\:nameSmiley Tongueatron OR @cm\:descriptionSmiley Tongueatron OR (documentoasociado.propiedad1=patron OR documentoasociado.propiedad2=patron OR …) )

Muchas gracias y un saludo :wink:
1 Reply
ajv
Member II

Re: Query Lucene compleja

Hola jjhinojosa!

La verdad que tenía este tema marcado como "pendiente" porque me pareció interesante y porque inicialmente no sabía cómo se podía enfocar…pero creo que he encontrado una solución, o por lo menos un enfoque  Smiley Very Happy
El problema está en que a la hora de elaborar la query, deberías saber qué tipo se está buscando para así, establecer las propiedades del tipo dinámicamente. Entonces, buscando un poco, he encontrado código que puede venir perfecto:
TypeDefinition nodeTypeDef = dictionaryService.getType(nodeTypeQName);
Map<QName, PropertyDefinition> propiedadesTipo = nodeTypeDef.getProperties();
Teniendo en cuenta que:
- nodeTypeQName es el nombre del tipo que nos han introducido en la búsqueda.
- nodeTypeDef contendrá la definición del tipo, básicamente todo lo que viene especificado en el xml de definición del tipo (nombre, título, descripción, propiedades, asociaciones, aspectos por defecto, etc.)
- propiedadesTipo contendrá todas las propiedades de ese tipo, incluyendo las heredadas de tipos padre.
Entonces, lo único que queda es elaborar la cadena de la query para lanzarla. Esto es muy sencillo, ya que la propia clase java podría ir concatenando en una cadena de texto las diferentes propiedades (con OR's) tal como querías hacer, y después ejecutar una búsqueda.

El tema de integración de este desarrollo con la búsqueda…si es un web script no hay problema, ya que puedes desarrollar un Java web script donde la clase monte la cadena de la query (y ya incluso el javascript puede lanzar esa query que le llega desde el java) o bien que la clase realice todo.
En fin, espero que por lo menos te haya ayudado a orientar el problema.  :wink:

Hasta pronto!