Question

Tout d'abord, permettez-moi de dire que je suis très nouveau pour JSR-170 et Jackrabbit / Lucene en général.

J'ai la requête XPath suivante:

//*[@sling:resourceType="users/user-profile" and jcr:contains(*/*/*,'sophie\-a')] order by @jcr:score descending

J'ai un utilisateur nommé Sophie-Allen et un utilisateur nommé Sophie-Anne. Recherche à l'aide de la requête retourne au-dessus de zéro résultats, où la recherche de rendements seuls « » les deux sophie utilisateurs. Je comprends que les moyens de trait d'union excluent dans JSR-170, mais je l'ai échappé (comme vous pouvez le voir ci-dessus).

Pourquoi cette requête ne renvoie pas les utilisateurs?

Une autre chose étrange est quand j'utilise astérisques (les traits d'union sont tous se sont échappés lors de l'exécution):

  • Recherche retourne 'sophie-allen' record de Sophie-Allen.
  • Recherche retourne 'soph*' fois Sophie-Allen et Sophie-Anne.
  • Recherche de 'sophie-a* ne retourne rien.
  • Recherche de retours 'sophie-allen*' rien.

Je comprends que avec JCR: CONTIENT, techniquement, vous n'avez pas besoin d'astérisques utiliser, mais en regardant le comportement ci-dessus, il semble avoir une sorte d'effet

.

Y at-il quelque chose d'autre que je me manque en ce qui concerne les traits d'union et astérisques dans les requêtes XPath et la recherche d'un JCR? J'ai googlé tout ce que je peux penser et lire les spécifications, mais ne peut pas sembler trouver quelque chose qui répond à ma question.

Merci à l'avance.

Edit: Il ressemble à une « phrase requête » ne fonctionne pas avec RJC. Contient (? Plus) comme valeur par défaut Lucene Analyzer tokenizes sur le trait d'union, ce qui signifie qu'il divise « sophie-allen » à Sophie et allen

Edit 2: Je l'ai essayé d'utiliser un analyseur personnalisé et tokenizer comme suggéré par quelqu'un sur la liste des utilisateurs de Jackrabbit, mais cela n'a pas aidé non plus, Lucene prend toujours le trait d'union et en omettant les résultats que je veux.

Était-ce utile?

La solution 2

Tout en travaillant à ce sujet avec un collègue, nous avons découvert cette JIRA pour ModeShape, soit dit en passant connecté par Randall (qui a répondu ici aussi). Il se trouve que le problème est causé par le fait que Jackrabbit ne gère pas un caractère générique dans un terme de recherche avec un caractère générique bien / trop.

Randall avait fait un correctif pour ModeShape mais mes collègues et l'équipe de projet désigné ne pas résoudre notre problème à ce stade que l'utilisation de Jackrabbit était pas certain à 100%.

Je voudrais associer la réponse à cette question à Randall, mais son poste n'est pas la réponse réelle. Je vais marquer ce post comme la réponse, à moins que Randall arrive et messages quelque chose.

Autres conseils

Vous avez raison Lucene fait split « sophie-allen » en deux jetons, mais ces jetons sont adjacents. Vous avez dit que vous avez essayé une expression de phrase comme ceci:

... jcr:contains(*/*/*,'"sophie-a*"') ...

Cela devrait fonctionner en trouvant le jeton « sophie » suivi d'un autre jeton contenant « a » comme premier caractère. Parce que le même analyseur utilisé lors de l'indexation doit être utilisé pour tokenizer cette expression expression, le caractère « - » sera toujours utilisé comme séparateur [1]. (Notez que si vous spécifiez votre expression XPath dans le code Java, vous auriez à échapper aux caractères guillemets doubles avec une barre oblique inverse précédente.)

Cependant, si cela ne fonctionne pas, vous pouvez essayer de prendre le trait d'union dans cette expression. Parce que vous utilisez des caractères génériques, la logique peut être tokenizing incorrectement l'expression générique. En d'autres termes, essayez:

... jcr:contains(*/*/*,'"sophie a*"') ...

Bien sûr, sans caractère générique, cela marcherait probablement (avec ou sans le trait d'union):

... jcr:contains(*/*/*,'"sophie-allen"') ...

Bonne chance!

P.S. Je n'ai pas vérifié que cela fonctionne dans Jackrabbit, mais il fonctionne dans ModeShape (qui utilise également Lucene).

[1] Les règles exactes dépendent du tokenizer. Par exemple, le StandardTokenizer filtre les mots d'arrêt anglais, mais le tokenizes « - ». Caractère sauf quand il y a un certain nombre dans le jeton (dans ce cas, l'ensemble jeton est interprété comme un produit et n'est pas fendu

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top