sdx-developers
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: RE : [sdx-developers] Commits


From: Pierrick Brihaye
Subject: Re: RE : [sdx-developers] Commits
Date: Wed, 08 Oct 2003 09:39:28 +0200
User-agent: Mozilla/5.0 (Windows; U; Win98; fr-FR; rv:1.0.2) Gecko/20030208 Netscape/7.02

Salut,

Rasik Pandey a écrit:

On va revisiter:

Bien :-)

Je ne suis pas toujours convaincu que c'était nécessaire mais peut-être
tu pourrais encore me persuader.

Cette liste est faite pour ça, non ? :-)

Les "postionIncrements" sont pris en compte au moment de l'indexation et
donc avec un Analyzer on aurait le même champ pour une valeur de la
racine(postionIncrement=1), avec plusieurs valeurs (stems/tokens) qui
ont une facture de l'équivalence (token.setPositionIncrement(0).

OK.

Au moment de la recherche, une requête qui contient le mot racine
(positionIncrement=1) ou l'un des stems (positionIncrement=0) seront
retrouvée avec ces valeurs car ils étaient stockée comme:

Nom du champ / texte / positionIncrement
FieldName, rootTermText,  1
fieldName, expandedTokenTextA, 0
fieldName, expandedTokenTextB, 0
fieldName, expandedTokenTextC, 0

Pour le stockage, OK, ça fonctionne bien et il n'y a *rien* à modifier (ouf !). Pour la requête... je ne suis pas d'accord. Voir plus bas.

Si je ne me trompe pas quand on fait une recherche pour soit
"rootTermText", soit "expandedTermTextA", soit "expandedTermTextB",  on
retrouvera tous nos documents qui étaient bien stockés en utilisant le
même Analyzer, non?

Oui. Si la requête n'a *qu'un seul* terme !

On va reprendre le code :

    else if (v.size() == 1)
        //!!!!C'est ici ou on va creer une requete pour le mot racine
et/ou ses "stems"
      return new TermQuery(new Term(field, (String) v.elementAt(0)));
        ///!!!!

Si la query comporte un token qui, à l'analyse, en renvoie plusieurs :

v.size() est supérieur à 1... autrement dit, ce code ne sera jamais appelé !

Voilà pourquoi j'ai dû beaucoup patcher le else qu'il y a ensuite qui, avant, avait la forme :

>     else {
>       PhraseQuery q = new PhraseQuery();
>       q.setSlop(phraseSlop);
>       for (int i=0; i<v.size(); i++) {
>         q.add(new Term(field, (String) v.elementAt(i)));
>       }
>       return q;
>     }
>   }

Etant entendu qu'on a plusieurs tokens, le patch fait 2 choses :

1) il vérifie si l'on a plusieurs positions (i.e. la somme de tous les positionIncrement est supérieure à 1). S'il n'y en a qu'une, il va faire des TermQuery, sinon des PhraseQuery.

2) il agence les queries dans une BooleanQuery (or).

a) ainsi, sur une seule position :

field:firstname
est résolu comme :
field:Rasik || field:Pierrick

b) sur N positions :

field:"firstname lastname"
est résolu comme :
field:"Rasik Pandey"" || field:"Rasik Brihaye" || field:"Pierrick Pandey" || field:"Pierrick Brihaye"

Avant,

a) était résolu comme : field:"Rasik Pierrick" (une phraseQuery)
b) était résolu comme : field "Rasik Pierrick Pandey Brihaye"

... peu de chances que ça donne des résultats :-)

Le problème était que ce code :

v.addElement(t.termText());
...
return new TermQuery(new Term(field, (String) v.elementAt(0)));

ignorait complètement le PositionIncrement et partait du postulat que plusieurs tokens généraient *obligatoirement* une PhraseQuery.

Est-ce plus clair ?

A+

--
Pierrick Brihaye, informaticien
Service régional de l'Inventaire
DRAC Bretagne
mailto:address@hidden





reply via email to

[Prev in Thread] Current Thread [Next in Thread]