cancel
Showing results for 
Search instead for 
Did you mean: 

Busquedas lentas Alfresco

dewil
Champ in-the-making
Champ in-the-making
Buenas tardes a todos.

Tengo un problema al realizar busquedas con "Lucene", tanto utilizando el "WebService", como realizando la búsqueda desde el mismo "Node Browser de Alfresco". ME explico, si realizo una búsqueda del tipo:
@miEsquema\:miPropiedadIndexada:"unapalabra"
Me salen unos 100 o 200 resultados y tarda bastante poco en realizar la búsqueda (~1 seg, muy rapido).

Sin embargo, cuando hago una búsqueda de varios miles de resultados, por ejemplo:
@cm\:creator:"admin"

Aunque la salida es del orden de 10.000 resultados, tarda muchísimo (~ 40 MINUTOS !!!!).

Revisando un poco todo el funcionamiento, y documentándome, veo que utilizando la busqueda pesada en el WebService da un "Read Time Out" (entiendo que supera el limite de milisegundos que le añado en la configuración de alfresco), adeamás la SQL que ejecuta Alfresco se queda pillada en la BD (que por cierto es Oracle) y tarda los 40 minutos que he comentado antes en terminarla. En el Node Browser si que la ejecuta sin dar "Read Time Out", pero tardando los 40 minutos que he comentado antes.

Realmente ahora mismo estoy utilizando Alfresco como "Contenedora de documentos estructurados", pero ahora además de esto voy a ir necesitando realizar busquedas desde un portal web (mediante WebService lo más posible) por los metadatos de Alfresco con Lucene, y claro, se puede dar el caso que buscando una palabra sencilla se encuentren 1000, 2000 o 5000 resultados (no me importaría si es necesario capar el número de resultado si con esto hago que funcione correctamente).

La versión de mi Alfresco es la 1.4 con Oracle en una máquina Linux, pero con las actualizaciones que estamos realizando migraremos a una versión mas reciente, aunque me temo que lo que me ocurre no es problema de versión. Por si sirve… de esta manera es como busco con el WebService:

RepositoryServiceSoapBindingStub repoWs = WebServiceFactory.getRepositoryService(alfSession.getResult());
      Query query = new Query();
      query.setLanguage(QNames.QUERY_LANG_LUCENE);
    StringBuffer qbuf = new StringBuffer(" +@cm\\:creator:\"admin\" ");
query.setStatement(qbuf.toString());
      try {
            logger.debug("Query buscando: ".concat(StringUtils.abbreviate(query.getStatement(), 1000)));
         QueryResult qres = repoWs.query(alfSession.getDefaultStore(), query, true);

Muchisimas gracias por cualquier consejo de ante mano.
2 REPLIES 2

dewil
Champ in-the-making
Champ in-the-making
Buenas a todos otra vez.

No sé si quizás el tema es basante complejo o no me expreso bien, pero veo porque no hay respuestas que trivial no es el problema . Voy a intentar concretar un poco más mi pregunta.

Por lo que he podido profundizar, tengo la impresión que el problema es del volumen que adquiere la consulta SQL que se forma cuando hago una búsqueda lucene (recuerdo que pueda devolver 5.000 o 10.000 filas). Monitorizando la BD Oracle veo que se forma la siguiente "Query", que entiendo es común al buscar por metadatos en Alfresco:

SELECT 
  nodestatus0_.protocol as protocol3_3_,
  nodestatus0_.identifier as identifier3_3_,
  nodestatus0_.guid as guid3_3_,
  nodestatus0_.transaction_id as transact4_3_3_,
  nodestatus0_.node_id as node5_3_3_,
  nodeimpl1_.id as id0_0_,
  nodeimpl1_.protocol as protocol0_0_,
  nodeimpl1_.identifier as identifier0_0_,
  nodeimpl1_.uuid as uuid0_0_,
  nodeimpl1_.type_qname as type5_0_0_,
  nodeimpl1_.acl_id as acl6_0_0_,
  storeimpl2_.protocol as protocol6_1_,
  storeimpl2_.identifier as identifier6_1_,
  storeimpl2_.root_node_id as root3_6_1_,
  aspects3_.node_id as node1_5_,
  aspects3_.qname as qname5_,
  parentasso4_.child_node_id as child3_6_,
  parentasso4_.id as id6_,
  parentasso4_.id as id4_2_,
  parentasso4_.parent_node_id as parent2_4_2_,
  parentasso4_.child_node_id as child3_4_2_,
  parentasso4_.type_qname as type4_4_2_,
  parentasso4_.qname as qname4_2_,
  parentasso4_.child_node_name as child6_4_2_,
  parentasso4_.child_node_name_crc as child7_4_2_,
  parentasso4_.is_primary as is8_4_2_,
  parentasso4_.assoc_index as assoc9_4_2_
FROM
  alf_node_status nodestatus0_ left outer join alf_node nodeimpl1_ on nodestatus0_.node_id=nodeimpl1_.id left outer join alf_store storeimpl2_ on nodeimpl1_.protocol=storeimpl2_.protocol and nodeimpl1_.identifier=storeimpl2_.identifier left outer join alf_node_aspects aspects3_ on nodeimpl1_.id=aspects3_.node_id left outer join alf_child_assoc parentasso4_ on nodeimpl1_.id=parentasso4_.child_node_id
WHERE
  nodestatus0_.protocol=:1 and
  nodestatus0_.identifier=:2 and
  nodestatus0_.guid=:3

Donde ":1", ":2" y ":3" son los parametros que se le pasan (entiendo que en función de la query Lucene). Esta SQL tarda unos 40 min cuando se devuelven unos 15.000 resultados en Alfresco.

Mi problema es intentar ajustar la programación y configuración para poder realizar consultas por los metadatos de Alfresco del tipo de Google. Mi pregunta es:

¿Es un problema de de la BD? (¿hay que optimizar la BD para esa SQL?), ¿es un problema de volumen de datos (60.000 documentos propios hacen intratable querys Lucene)? ¿Con volúmenes de datos así deberíamos o se pueden configurar querys Lucene para limitar los resultados y que se haga tratable la consulta?

Muchas Gracias.

dewil
Champ in-the-making
Champ in-the-making
Visto que tengo un pauperrimo éxito. Pero sigo un poco perdido en la solución. Concreto aun más la pregunta:

¿El parámetro "system.acl.maxPermissionChecks" se refiere al máximo número de resultados que devolverá una consulta Lucene? Pero cuando el resultado real de la consulta es de por ejemplo, 15.000 ¿se cortá la SQL formada en la BD? ¿Cual es el efecto?

He probado esta configuración,

# Properties to limit resources spent on individual searches
#
# The maximum time spent pruning results
system.acl.maxPermissionCheckTimeMillis=1000
# The maximum number of results to perform permission checks against
system.acl.maxPermissionChecks=100

pero cuando hago una busqueda @cm\:creator:"admin" , me da un Read Time Out (lógico porque si no tardaría 40 min) y no traerse el numero de resultados que pudiese recoger.

Agradecería cualquier tipo de ayuda o consejo.

Muchas Gracias.