sdx-developers
[Top][All Lists]
Advanced

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

RE : [sdx-developers] Commits


From: Rasik Pandey
Subject: RE : [sdx-developers] Commits
Date: Tue, 7 Oct 2003 17:24:54 +0200

Salut,

On va revisiter:

 >
 >Je viens de commiter :
 >
 >
 >3) un QueryParser capable de traiter les queries en arabe. Il 
 >y a également un autre truc (v. plus bas, point 6)
 >

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

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). 

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

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?

Donc, on pourrait garder ce code dans DefaultQueryParser.java:


 protected Query getFieldQuery(String field,
                                Analyzer analyzer,
                                String queryText) {
    // Use the analyzer to get all the tokens, and then build a
TermQuery,
    // PhraseQuery, or nothing based on the term count

    TokenStream source = analyzer.tokenStream(field,
                                              new
StringReader(queryText));
    Vector v = new Vector();
    org.apache.lucene.analysis.Token t;

    while (true) {
      try {
        t = source.next();
      }
      catch (IOException e) {
        t = null;
      }
      if (t == null)
        break;
        //!!!!!C'est ici ou on aura soit le termText du mot racine soit
le termText (stem) ou un stem de l'utilisateur)
      v.addElement(t.termText());
        //!!!!!!
    }
    if (v.size() == 0)
      return null;
    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)));
        ///!!!!
    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;
    }
  }



 
 ?


Rasik





reply via email to

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