WebService Problème Path Lucene

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

WebService Problème Path Lucene

Bonjour,

Je développe actuellement un appel de WebService via l'API fournie pour stocker et récupérer des fichiers dans Alfresco.

J'ai actuellement un problème avec la syntaxe Lucene pour spéficier un chemin spécifique. Je m'explique, avant de stocker le fichier, je dois vérifier si un fichier portant le même nom est déjà présent, si c'est le cas supprimer l'ancien fichier et le remplacer. Pour cela j'utilise deux paramètres : le path et le nom du fichier. J'utilise la méthode Query du Repository pour vérifier si le fichier existe déjà :


public String uploadContent(String path, String fileName){
      String contentUUID = new String();
      try{
      //Start the session
      AuthenticationUtils.startSession("admin", "admin");
      Store storeRef = new Store(Constants.WORKSPACE_STORE, "SpacesStore");
               ParentReference companyHomeParent = new ParentReference(storeRef, null, "/app:company_home", Constants.ASSOC_CONTAINS, null);
               RepositoryServiceSoapBindingStub repositoryService =WebServiceFactory.getRepositoryService();
               ContentServiceSoapBindingStub contentService =WebServiceFactory.getContentService();

               String queryLucene = "+PATH:\""+companyHomeParent.getPath()+"//*\" +@\\{http\\://www.alfresco.org/model/content/1.0\\}name:\"" + fileName + "\"";
      query = new Query(Constants.QUERY_LANG_LUCENE, queryLucene);
      ResultSet rs = repositoryService.query(storeRef, query, false).getResultSet();
      
      if(rs.getTotalRowCount() > 0){
               // Suppression du fichier
               }
               // Upload du fichier
               (…)

Ce code fonctionne très bien si l'arborescence utilisée est app:company_home. Par contre, dès que j'essaye de faire la même manipulation dans un sous dossier, par exemple : company_home/upload, l'envoie du fichier fonctionne très bien si le fichier n'est pas déjà présent, mais pas la requête en Lucene :
ParentReference companyHomeParent = new ParentReference(storeRef, null, "/app:company_home/cm:upload", Constants.ASSOC_CONTAINS, null);
String queryLucene = "+PATH:\""+companyHomeParent.getPath()+"//*\" +@\\{http\\://www.alfresco.org/model/content/1.0\\}name:\"" + fileName + "\"";

L'upload la première fois fonctionne très bien, mais la méthode repositoryService.query() ne retourne aucun résultat.
A noter que j'ai essayé de faire un rebuild FULL de l'index sans succès.

Avez vous une idée ?

Merci d'avance =)

Configuration :
VM Ware Windows Server 2003 SP2
Alfresco Labs 3b Full Setup
Tomcat / MySQL
5 Replies
romain_lamarche
Member II

Re: WebService Problème Path Lucene

Attention,

les requêtes Lucene sont "instable", car l'indexation se fait en arrière plan.
Il se peut donc que si la requête est effectuée juste après la création du noeud, elle ne renvoi rien.

Vous pouvez utiliser le service "get" en spécifiant un "path" dans le predicat pour faire une requête sur le chemin d'un noeud.
Mais si c'est pour vérifier l'existence du noeud créé, il veut encore mieux utiliser directement le "nodeRef".
cleseach
Active Member II

Re: WebService Problème Path Lucene

Bonjour,

Avez-vous essayer de jouer votre requête Lucene avec le navigateur de noeuds ?

Cordialement,
Charles Le Seac'h
john31
Member II

Re: WebService Problème Path Lucene

Bonjour,

Tout d'abord je vous remercie pour votre aide.

Attention,

les requêtes Lucene sont "instable", car l'indexation se fait en arrière plan.
Il se peut donc que si la requête est effectuée juste après la création du noeud, elle ne renvoi rien.

Vous pouvez utiliser le service "get" en spécifiant un "path" dans le predicat pour faire une requête sur le chemin d'un noeud.
Mais si c'est pour vérifier l'existence du noeud créé, il veut encore mieux utiliser directement le "nodeRef".

Je ne m'étais pas interressé à la méthode get du predicat, pensant que pour faire des requêtes sur des noeuds et des objets la meilleure façon était d'utiliser la méthode query du repositoryService en Lucene ou Xpath. Je vais regarder cela de plus près, cela est-il également la meilleure solution pour récupérer un document à partir de son uuid en webservice ? Car pour le moment j'utilise aussi une requete lucène de ce type :
String queryLucene = "+@sys\\:node-uuid:\"" + uuid + "\"";
      Query query = new Query(Constants.QUERY_LANG_LUCENE, queryLucene);
      ResultSet rs = repositoryService.query(storeRef, query, false).getResultSet();

Pour ce qui est de l'indexation Lucene en live, je ne pense pas que le problème vienne de là, car ma requête fonctionne très bien si j'utilise la racine "company_home" avec un fichier que je viens à peine d'envoyer et le noeud "cm:upload" a été créé depuis un moment et j'ai même refait un rebuild full de l'index au démarrage de Tomcat sans succès.

par cleseach sur 05 Nov 2008, 12:11
Bonjour,

Avez-vous essayer de jouer votre requête Lucene avec le navigateur de noeuds ?

Cordialement,
Charles Le Seac'h

Non, car je ne sais pas de quoi vous parlez  :roll:
Je vais essayer de trouver ça et tester ma requête dedans.
rivarola
Active Member

Re: WebService Problème Path Lucene

Bonjour,

Pour le "Node Browser" il faut aller dans "Administration Console" (bouton tout en haut lorsque tu es connecté en admin). Une fois cliqué sur "Node Browser" tu choisis le compartiment "workspace://SpacesStore" puis le choix "lucene" dans la liste déroulante sous "Search".
Evidemment, les labels ne sont pas les mêmes si tu as une interface en français…
michel
Member II

Re: WebService Problème Path Lucene

Bonjour,

le problème vient de la requête lucene elle même:


String queryLucene = "+PATH:\""+companyHomeParent.getPath()+"//*\" +@\\{http\\://www.alfresco.org/model/content/1.0\\}name:\"" + fileName + "\"";

cette requête ne regrade que sous company home (au premier niveau de l'arborescence).
Donc il faut aussi regarder en dessous .

et pour ce il faut la transformé en :


String queryLucene = "+(PATH:\""+companyHomeParent.getPath()+"/*\" PATH:\""+companyHomeParent.getPath()+"/*//*\")\" +@\\{http\\://www.alfresco.org/model/content/1.0\\}name:\"" + fileName + "\"";

Et oui je sais c'est assez barbare comme requête Smiley Happy

Bien à toi.

Michel.