2009-05-11 6 views
3

J'utilise Lucene pour Java et j'ai besoin de comprendre ce que fait le moteur lorsque j'exécute des requêtes obscures. Prenez la requête suivante:Opérateurs imbriqués/require dans les requêtes de recherche Lucene

+(foo -bar) 

Si j'utilise QueryParser pour analyser l'entrée, je reçois un objet BooleanQuery qui ressemble à ceci:

org.apache.lucene.search.BooleanQuery: 
    org.apache.lucene.search.BooleanClause(required=true, prohibited=false): 
     org.apache.lucene.search.BooleanQuery: 
      org.apache.lucene.search.BooleanClause(required=false, prohibited=false): 
       org.apache.lucene.search.TermQuery: foo 
      org.apache.lucene.search.BooleanClause(required=false, prohibited=true): 
       org.apache.lucene.search.TermQuery: bar 

quoi ressemble Lucene pour? Est-ce que les documents DOIVENT contenir 'foo' mais NE PEUVENT PAS contenir 'bar'? Que faire si je recherche:

-(foo +bar) 

sont ces documents qui ne peuvent pas contenir « foo » et ne peut pas contenir « bar »? Ou peut-être ceux qui ne peuvent pas contenir «foo» mais DOIVENT contenir «barre»?

Si elle aide tout, voici ce que je faisais jeter un regard dans les résultats QueryParser:

QueryParser parser = new QueryParser("contents", new StandardAnalyzer()); 
Query query = parser.parse(text); 
debug(query, 0); 

public static void debug(Object o, int depth) { 
    for(int i=0; i<depth; i++) System.out.print("\t"); 
    System.out.print(o.getClass().getName()); 

    if(o instanceof BooleanQuery) { 
     System.out.println(":"); 
     for(BooleanClause clause : ((BooleanQuery)o).getClauses()) { 
      debug(clause, depth + 1); 
     } 
    } else if(o instanceof BooleanClause) { 
     BooleanClause clause = (BooleanClause)o; 
     System.out.println("(required=" + clause.isRequired() + ", prohibited=" + clause.isProhibited() + "):"); 
     debug(clause.getQuery(), depth + 1); 
    } else if(o instanceof TermQuery) { 
     TermQuery term = (TermQuery)o; 
     System.out.println(": " + term.getTerm().text()); 
    } else { 
     throw new IllegalArgumentException("Unknown object type"); 
    } 
} 

Répondre

1

Par défaut, Lucene suppose une relation OU entre les termes, donc la première requête est équivalente à

+(foo OR -bar) 

qui restituera les documents qui contiennent (dans le champ par défaut) « foo » ou ne contiennent pas de « bar »

dans la deuxième requête, le « + » fait « bar » nécessaire, ce qui rend la option « foo » redondant, donc il peut être réduit à « -bar » qui correspond à tous les documents qui ne contiennent pas « bar »

+0

Merci, cela fait sens ! –

0

Luc http://www.getopt.org/luke/ est très utile pour comprendre ce que les requêtes ne

+0

Cet outil ne m'a pas aidé avec la question que j'ai posté, mais il fournit beaucoup de précieuses informations de diagnostic que je sais seront utiles à l'avenir. Merci pour cela, je l'ai transmis à mon équipe. –

Questions connexes