Résultat de requête Lucene imcomplet

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

Résultat de requête Lucene imcomplet

Bonjour,

Je développe une extension qui doit exécuter des requêtes Lucene pour trouver des noeuds sur Alfresco Community 3.2.
Dans l'exemple qui suit, je recherche les documents contenus dans tous les sites qui contiennent le mot "salut".


RetryingTransactionCallback<ResultSet> searchCallback = new RetryingTransactionCallback<ResultSet>() {
   public ResultSet execute() throws Throwable {
     SearchParameters sp = new SearchParameters();
     sp.addStore(Repository.getStoreRef());
     sp.setLanguage(SearchService.LANGUAGE_LUCENE);
     sp.setQuery("PATH:\"/app:company_home/st:sites//*\" AND EXACTTYPE:\"cm:content\" AND TEXT:\"salut\"");
     return searchService.query(sp);
   }
};

try {
  ResultSet results = transactionService.getRetryingTransactionHelper().doInTransaction(searchCallback, true);
  System.out.println("Resultats : " + results.length());
} catch (Throwable e) {
  e.printStackTrace();
}

En théorie, je devrais trouver 3 résultats.
Le problème est que je n'en récupère que 2.
Ensuite, j'effectue la même requête avec le node browser, il me renvoie 3 résultats.
Si je relance à nouveau mon extension, j'obtiens bien cette fois ci 3 résultats (toujours avec la même requête).

Après avoir fait quelques tests, j'ai constaté que tant que je ne lançais pas une requête (n'importe laquelle) avec le node browser, j'obtenais toujours 2 résultats.
Par contre, dès que j'ai lancé une requête avec le node browser, mon extension me renvoie 3 résultats.

Ma question est donc la suivante, aurais-je oublié un paramètre d'initialisation permettant d'assurer que le résultat d'une requête lucene est correct.
Ou encore, qu'est-ce que le node browser fait que je ne fais pas ?

Si vous avez une idée, n'hésitez pas.
Merci d'avance.
Cordialement
2 Replies
rguinot
Customer

Re: Résultat de requête Lucene imcomplet

Vous avez combien de docs et répertoires (spaces)  en gros dans vos sites ?

Ce qu'il faut savoir c'est qu'une requête va s'arrếter quand l'une des 2 limites suivantes est atteinte :
- Pour chaque resultSet, on élimine les résultats auquel l'utilisateur ayant lancé la recherche n'a pas accès en évaluation les permissions pour chaque noeud. Le résultat de cette évaluation est mis dans un cache.
- La requête a passé un temps prédéfini à évaluer des permissions.

Ces deux facteurs correspondent aux paramètres suivant définis comme suit par défaut dans repository.properties :

# The maximum time spent pruning results
system.acl.maxPermissionCheckTimeMillis=10000
# The maximum number of results to perform permission checks against
system.acl.maxPermissionChecks=1000

Il faut donc savoir que la première fois qu'on éxécute une requête (repository à froid), la requête va ramener un certain nombre de résultats. Ce nombre sera plus grand à la deuxième éxécution puisque l'évaluation des permissions faites la première fois et mise en cache (si on avait pas déjà ramené tous les résultats la première fois), et  on peut donc passer plus de temps à filtrer les permissions des nouveaux résultats jusqu'à ce qu'une des deux précédentes limites soient atteintes, et ainsi de suite.

D'ou ma quesrtion, si vous n'avez pas beaucoup de nodes vous devriez avoir des résultats constants.
D'autre part que se passe-t-il si vous éxécutez votre requête sans la partie PATH (avec juste la partie EXACTTYPE et TEXT) ?
zederk
Member II

Re: Résultat de requête Lucene imcomplet

Bonjour,

Je pense que le problème ne vient pas de là.
Tout d'abord, je n'ai que très peu de document dans mes sites (une quinzaine au maximum).
Sinon, les résultats de requête sans le PATH rapportent des résultats similaires.

Ensuite, j'ai effectué d'autres cas de tests particulièrement surprenant :

J'ai mis trois documents t1.txt, t2.txt et t3.txt ayant le même contenu (à savoir le mot "bonjour").
Une recherche de "bonjour" avec mon extension retourne seulement 2 résultats : t1.txt et t2.txt.
Ensuite, j'effectue la même requête lucene avec le node browser, celui-ci ne me trouve que t3.txt.
Si je réexécute la recherche avec mon extension, elle me retourne plus que t3.txt (car j'ai effectué une requête avec le node browser).

Là, j'avoue ne rien y comprendre…
Il y a plusieurs phénomènes surprenants :
- Pourquoi le node browser n'est pas capable de trouver tous les résultats correspondant à ma requête
- Pourquoi la même requête Lucene, exécutée avec le même code java, ne retourne pas le même résultat à chaque fois
- Quel est le lien entre l'exécution d'une requête avec le node browser et une requête avec mon extension (ou pourquoi l'exécution d'une requête avec le node browser influence le résultat de mon extension).

Voila, si quelqu'un a des réponses pour toutes ces questions, je suis preneur.
Merci d'avance.