[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RE: [sdx-users] Problème sdx:filter - Résolu
From: |
Castonguay Dave |
Subject: |
RE: [sdx-users] Problème sdx:filter - Résolu |
Date: |
Wed, 23 Mar 2005 13:30:13 -0500 |
Je me répond encore...
D'abord, désolé Pierrick d'avoir massacré ton nom. :)
Je confirme ce que je disais dans mon message précédent.
J'ai modifié la classe Terms et maintenant tout fonctionne pour le mieux...
À un détail près, c'est que les expressions passées en paramètre (dans sdx:term
avec qid) doivent être des expressions régulières. Donc pour trouver tous les
termes commençant par "F", le paramètre "value" de mon sdx:term doit être:
"F.*" ou pour être exact "^F.*"
Donc, pour référence encore une fois. Voici ma XSP.
Cette XSP permet de retrouver, dans les documents résultat de la requête
identifier par le paramètre "qid", tous les termes du paramètre "field" ayant
une valeur correspondante à la valeur du paramètre "value" (qui est une
expression régulière).
<xsp:logic>
String val = request.getParameter("val");
if (val == null || val.equals("")) {
val = "*";
}
</xsp:logic>
<sdx:linearQuery base="notice" field="affiche_portfolio"
fieldParam="" valueString="val" op="OR"/>
<sdx:results hpp="0"/>
<xsp:logic>String myQid=sdx_qid;</xsp:logic>
<sdx:terms qidString="myQid">
<sdx:parameter name="field" valueParam="field" />
<sdx:parameter name="value" valueParam="value" />
<!-- value est une expresion de la forme: ^X.* -->
<sdx:parameter name="field" valueParam="field" />
<sdx:location base="notice"/>
</sdx:terms>
Pour que cette XSP nous donne les résultats escomptés on doit modifier la
classe Terms de l'API sdx.
Il faut remplacer la ligne #900:
if (values == null || values.length == 0 || (j < values.length &&
(!Utilities.checkString(values[j]) || lftext.equals(values[j])))) {
Par :
if (values == null || values.length == 0 || (j < values.length &&
(!Utilities.checkString(values[j]) || lftext.matches(values[j])))) {
Voilà :)
Encore un gros gros merci à ceux qui m'ont aidé et qui m'ont indiquer la piste
à suivre!
Bonne journée
Dave
-----Message d'origine-----
De : address@hidden
[mailto:address@hidden la
part de Castonguay Dave
Envoyé : 23 mars, 2005 11:22
À : address@hidden
Objet : RE: [sdx-users] Problème sdx:filter
Encore moi,
je remonte ma moyenne d'Activité sur la liste :)
Bon, j'ai investigué... Résultat, oubliez la partie sur la logicsheet du
message précédent.
J'avais tout faux!
Cette fois par contre, je crois que j'ai compris ce qui ce passe.
Le problème, il y a des différences de comportements entre les deux "requêtes"
suivants:
1. <sdx:terms fieldParam="field" valueParam="value"/>
et
2. <sdx:terms qidString="myQid" fieldParam="field" valueParam="value"/>
La différence est au niveau de la classe Terms elle même et en particulier dans
la méthode getTerms.
Deux implementation différentes de getTerms sont appellées.
En gros, dans le premier cas, les paramètres sont comparés avec la base de
document en utilisant des objets Filter.
Dans le second cas, on retrouve d'abord les "hits" de la requête spécifié par
"qidString".
Ensuite on retrouve pour chacun des "hits" les valeurs pour le champ filtré.
Ensuite on compare les valeurs du "hit" directment avec la valeur du filtre en
faisant un String.equals (genre: hitValeur.equals(filtreValeur) ). (voir
Terms.java ligne 872-929)
C'est tout à fait en accord avec les tests que j'ai fait.
- Si qidString réfère à une requête inexistante. Aucun résultat, car la
collection de "hits" est null.
- Si qidString a effectivement des "hits" et que valueParam est une expression
du genre "B*". Aucun résultat, car valeurHits n'est jamais égal à valueParam.
- Enfin, Si qidString a effectivement des "hits" et que valueParam correspond à
une valeur complète du genre "Biographie". Nous aurons des résultats pour les
cas ou valeurHits est égale à valueParam.
Ça clarifie la situation pour moi. Mais ça ne r`gle pas mon problème. :(
Je vais tenter une petite modification à la classe Terms. Je vais simplement
changer l'appel String.equals pour un String.matches. Le second comparant avec
un expression régulière plutôt qu'avec une valeur exacte.
Selon moi, ça devrait permettre de faire des sdx:terms avec des truncature (B*)
en se basant sur une requête précedente.
Je vous tiens au courant.
Bonne journée
Dave
-----Message d'origine-----
De : address@hidden
[mailto:address@hidden la
part de Castonguay Dave
Envoyé : 23 mars, 2005 09:51
À : address@hidden
Objet : RE: [sdx-users] Problème sdx:filter
Re à tous :)
Merci pour les réponses!
J'ai essayé ce que Pierre a suggéré. Je me suis vite apperçu que j'avais besoin
d'un executeQuery :)
Ça fonctionne bien. :)
Sauf que pour le moment ma base est vide et vos inquiétudes faces aux
performances me font un peu peur :(
Autre chose qui est malheureuse pour moi, c'est que en passant un paramètre
"qid" à sdx:terms, on perd la possibilité
de de passer des truncature (B*). Ce dont j'avais besoin car ces pages sont
orgnaisé par liste alpha (où on offre des liens sur les lettres ayant des
termes).
On voit dans la logicsheet:
sdx_object=getSessionObject(session, sdx_parameter);
if (sdx_object != null && sdx_object instanceof Results)
{
sdx_results=(Results)sdx_object;
if (sdx_results != null) sdx_terms.setUp(sdx_results, sdx_fields[0],
sdx_values[0]);
}
On remarque que l'onne passe que le premier élément des sdx_fields[] et
sdx_values[].
Ce qui rend impossible (aucun résultats):
<sdx:terms qidString="myQid">
<sdx:parameter name="field" valueParam="field" />
<sdx:parameter name="value" valueParam="value" />
<!-- value est A*, B*, C*, etc... -->
<sdx:parameter name="field" valueParam="field" />
<sdx:location base="notice"/>
</sdx:terms>
Mais ce code fonctionne très bien si on ne passe pas le qid.
Par contre, je ne comprend pas pourquoi le code suivant ne fonctionne pas:
<sdx:terms qidString="myQid" fieldParam="field" valueParam="value"/>
Des idées?
Ce que je vais faire pour le moment,
c'est de faire des test en modifiant la logicsheet pour que l'on passe tous les
sdx_fields et tous les sdx_values à la méthode setUp de Terms. Je vais voir
comment ça réagit mais de ce que j'ai vu/compris de la classe Terms, ça ne
dervait pas changer grand chose.
Je vous tiens au courant :)
Bonne journée
Dave
-----Message d'origine-----
De : address@hidden
[mailto:address@hidden la
part de Pierrick Brihaye
Envoyé : 23 mars, 2005 03:22
À : address@hidden
Objet : Re: [sdx-users] Problème sdx:filter
Salut,
Malo Pichot a écrit :
>>> <sdx:simpleQuery query="type_document:Sonore type_document:Braille" />
>>> String myQueryId = sdx_qid;
>>> <sdx:terms field="sujet" qidString="myQueryId"/>
>
> Je rectifie ; la syntaxe ici ne devrait pas fonctionner : sdx_qid n'est
> pas créer avec <sdx:simleQuery>. C'est le boulot de <sdx:results /> ou
> de toute <sdx:execute*Query />.
Oui. Je m'etonne d'ailleurs d'avoir oublié ce execute.
> On peut employer :
>
> <sdx:simpleQuery query="type_document:Sonore type_document:Braille" />
> <sdx:results qid="myQueryId" hpp="0" />
Bien vu. Le hpp="0" fera gagner un peu de performance (20 résultats de
moins dans le tuyau).
><sdx:terms field="sujet" qidString="myQueryId"/>
Gaffe : il manque le String myQueryId = sdx_qid; que l'on peut
factoriser probablement ainsi :
<sdx:terms field="sujet" qidString="sdx_qid"/>
... mais c'est plus difficile à déboguer.
En ce qui concerne la performance, je partage les scrupules de Martin,
surtout dans le cas proposé qui effectue préalablement une requête "OR".
Ca oblige à un produit cartésien assez dispendieux.
Si je ne me trompe pas, on a tout de même une possibilité, pas très
élégante, de "filtrage" dans <sdx:terms>. Il "suffit" d'utiliser une
troncature :
<sdx:terms field="sujet" value="a*" />
ou, plus généralement, si j'en crois le code, une expression régulière
(v.
http://savannah.nongnu.org/cgi-bin/viewcvs/sdx/sdx_v2/src/java/fr/gouv/culture/sdx/search/lucene/query/Terms.java?annotate=1.73,
ligne 208).
Cela permet de restreindre les termes éligibles et, le cas échéant,
d'organiser un paging :
a-h i-m n-s t-z par exemple...
A+
--
Pierrick Brihaye, informaticien
Service régional de l'Inventaire
DRAC Bretagne
mailto:address@hidden
+33 (0)2 99 29 67 78
_______________________________________________
sdx-users mailing list
address@hidden
http://lists.nongnu.org/mailman/listinfo/sdx-users
AVIS DE CONFIDENTIALITÉ - AVERTISSEMENT RELATIF À LA LOI SUR L'ACCÈS AUX
DOCUMENTS DES ORGANISMES PUBLICS ET SUR LA PROTECTION DES RESEIGNEMENTS
PERSONNELS (L.R.Q.,c.A.-2.1): L'information transmise avec ce courrier
électronique est de nature privilégiée et confidentiellle. Elle est destinée à
l'usage exclusif de son destinataire. Si vous n'êtes pas le destinataire visé,
vous êtes par la présente avisé qu'il est strictement interdit d'utiliser cette
information, de la copier, la distribuer ou la diffuser. Veuillez s'il vous
plaît contacter l'expéditeur initial du courrier électronique et le détruire de
votre ordinateur.
_______________________________________________
sdx-users mailing list
address@hidden
http://lists.nongnu.org/mailman/listinfo/sdx-users
_______________________________________________
sdx-users mailing list
address@hidden
http://lists.nongnu.org/mailman/listinfo/sdx-users
- RE: [sdx-users] Problème sdx:filter - Résolu,
Castonguay Dave <=