Uso de luceneSearch

cancel
Showing results for 
Search instead for 
Did you mean: 
venzia
Senior Member

Re: Uso de luceneSearch

Pues si es un poco extraño .. todo es ponerse a hacer pruebas .. pero me da que ahora mismo lo tengo dificil.
Para querys combinadas no hay mucha mas historia que la que ponen en el wiki http://wiki.alfresco.com/wiki/Search#Combined_Queries
Y el tema del PATH tampoco debería tener mas misterio .. ya te digo q el script q he posteado a mi me funciona perfectamente (y comprobado q solo trae lo que debe).
En fin .. no se que mas decirte .. mas pruebas y si ves algun detalle que pueda ser relevante lo comentas por aqui?.
La verdad q el post lo he seguido un poco a lo rapido .. asi que lo mismo no he entrado a valorar algo q debia. De todas formas no te veo lejos de conseguirlo tu mismo :wink:.
Saludos y suerte!
venzia
Senior Member

Re: Uso de luceneSearch

Ya por curiosidad me he puesto .. y a mi casos similares si que me funcionan (siempre es bueno probar el query en el explorador de nodos).
De todas formas si ves que tienes muchos problemas con el tema del path (lo mismo tiene q ver con que no localiza user_home y se queda en company_home .. ya por decir algo) .. prueba con el tipo carpeta y el campo descripcion unicamente (que supongo sera unica en el repositorio)
Saludos!
vlopez
Member II

Re: Uso de luceneSearch

Javier me está funcionando. Ante todo agradecerte sinceramente tu inestimable ayuda sin la que hubiera sido del todo imposible llegar al resultado final, y también agradecer la colaboración de pjcaracuel (Pedro Jiménez).
Bien al grano.
El problema del script era la línea con la que comenzaba el primer "If":
if (carpetacliente!= null)
A mi me costó, porque no soy programador, pero aplicando la lógica del script al final me di cuenta que por aquí pasaba todo, y devolvía cualquier resultado (no se exactamente cuál), lo que hacía que el resto del script fuera mal interpretado. Como la búsqueda me devuelve una matriz de nodos, la comparación parece ser que siempre era algún tipo de valor. Así que sustituí dicha línea por el valor que en las siguientes líneas se empleaba, es decir "carpetacliente[0], y "voilá", salió andando. Así que esa línea queda del siguiente modo:
if (carpetacliente[0]!= null)
También cambié la ruta de la carpeta clientes, aunque dentro de User Homes, también funciona.
El código completo del script queda del siguiente modo (con una pequeña modificación, puesto que la descripción de la carpeta lleva por delante la palabra Cliente más un espacio):
var documento   = document.name;
var codigo = documento.substr(0,6);
var nombre = "Cliente "+codigo;
var pendientes = space.childByNamePath("pendientes");
var carpetacliente = search.luceneSearch("+PATH:\"/app:company_home/cm:Clientes//*\" AND TYPE:\"cm:folder\" AND @cm\\:description:\""+nombre+"\"");

if (carpetacliente[0]!= null)
  { 
     if(carpetacliente[0].hasPermission("CreateChildren"))
      {
        var copy = document.move(carpetacliente[0]);
        if (copy != null)
      {
          document.name = documento;
         document.save();
       }
      }
     }
else
{
  var copy = document.move(pendientes);
   if (copy != null)                                  
     {
    document.name = documento;
    document.save();
     }
}
Por supuesto, este código no es perfecto y menos teniendo en cuenta de donde proviene (no soy programador), y es muy mejorable, por lo que agradecezco cualquier sugerencia.
Hay algunas cosas que es necesario aclarar y resumir:
  • La carpeta Clientes debe incluir la Carpeta que yo llamo Registro de Entrada que es la carpeta a la que se le aplica la regla.

  • La carpeta Registro de Entrada contiene otra carpeta que llamo pendientes, que es donde se incluirán aquellos archivos mal nombrados o cuya carpeta de cliente no exista.

  • De la carpeta Clientes cuelgan todas las carpeta de clientes que se identifican por [Código de 6 dígitos][Nombre del cliente], sin espacios entre el código y el nombre del cliente. Aunque de cara al script el nombre de la carpeta da igual porque como se ve a continuación se emplea el campo descripción.

  • Cada carpeta de un cliente debe tener como descripción Cliente [Código de 6 dígitos], con un espacio entre Cliente y código, que es el campo por el que realmente se realiza la búsqueda, y que como dijo Javier evita la codificación a ISO 9075, ya que ésta solo se aplica al nombre de la carpeta.

  • Los nombre de archivos se codifican comenzando siempre por el código del cliente, es decir, [Código de 6 dígitos][texto libre].

  • He hecho pruebas en dos Alfresco distintos (2.9 y 3.2), si bien, esto puede ser un problema de cara a la sintáxis de Lucene, creo que el problema me lo daba realmente que en la versión 2.9 el directorio de almacenamiento era variable y no fijo (el famoso dir.root). Aunque esto no lo puedo asegurar del todo.

  • Por otra parte con las funcionalidades propias de Alfresco se solventan otra serie de cosas, como la introducción de dos archivos con el mismo nombre en la misma carpeta, o la existencia de dos carpetas con el mismo campo descripción. En el primer caso, si la inclusión de documentos se realiza a través de la interfaz web, Alfresco lanza un error, si se hace a través de CIFS, lo pasa a la carpeta pendientes (esto último no lo he testado suficientemente). En el caso de que existan dos carpetas con la misma descrición, Alfresco introduce el documento en la primera carpeta con el mismo nombre que encuentre, que será aquella que primero se creó en el tiempo.
Este script creo que supone en si un modelo de organización de al menos una parte de cualquier empresa, puesto que si existe un sistema de codificación de los nombre de archivos y de los nombres de carpetas, la distribución de documentos es una tarea automatizada, y que además implica incrementar el grado de seguridad y confidencialidad, ya que aquellos que se encargan de la introducción de documentos de forma masiva (el registro de entrada), no tienen porqué tener acceso a las carpetas de los clientes, eliminando problemáticas de actuaciones por mala fe, o por descuido, y limando las responsabilidades sobre la documentación de cada cliente (esto no es superfluo, tal y como están las cosas en lo relativo a la LOPD, y tal como se van a poner).
En fin, espero que le sea útil a más gente, y al que le valga que por favor le mande el agradecimiento a Javier Martínez.
venzia
Senior Member

Re: Uso de luceneSearch

Perfecto Tini!! .. me alegro!! .. no obstante yo meteria la comprobacion de si ha devuelto algo, puesto que en el caso que no encuentre la carpeta destino te va a petar el tipico tema de "index out of the bound". Quedaria de la siguiente forma :
var documento   = document.name;
var codigo = documento.substr(0,6);
var nombre = "Cliente "+codigo;
var pendientes = space.childByNamePath("pendientes");
var carpetacliente = search.luceneSearch("+PATH:\"/app:company_home/cm:Clientes//*\" AND TYPE:\"cm:folder\" AND @cm\\:description:\""+nombre+"\"");

if (carpetacliente!= null)
{
   if (carpetacliente[0]!= null)
   {
      if(carpetacliente[0].hasPermission("CreateChildren"))
      {
         var copy = document.move(carpetacliente[0]);
         if (copy != null)
         {
           document.name = documento;
          document.save();
         }
      }
   }
   else
   {
     var copy = document.move(pendientes);
      if (copy != null)                                  
       {
      document.name = documento;
      document.save();
       }
   }
}
else
{
   var copy = document.move(pendientes);
   if (copy != null)                                  
   {
      document.name = documento;
      document.save();
   }
}
(puede que se me haya escapado meter alguna llave { .. } )
Prueba y si ves que da problemas obvias mi comentario.
Saludos,