2009-08-12 9 views

Répondre

1

Traverse sur l'arbre de BooleanQuery et supprimer les entrées terme liées (« aide »)

+0

des sites/suggestions où chercher pour faire cela? –

1

Ceci est un ordre de grandeur de ce que votre code devrait ressembler à:

public static void removeNonDefault(BooleanQuery query, String defaultField) { 
    List<BooleanClause> clauses = (List<BooleanClause>)query.clauses(); 
    Iterator<BooleanClause> iter = clauses.iterator(); 
    while(iter.hasNext()) { 
     BooleanClause clause = iter.next(); 
     Query subQuery = clause.getQuery(); 

     if(subQuery instanceof BooleanQuery) { 
      removeNonDefault((BooleanQuery)subQuery, defaultField); 

     } else if(subQuery instanceof TermQuery) { 
      if (!((TermQuery) subQuery).getTerm().field().equals(defaultField)) { 
       iter.remove(); 
      } 

     } 
    } 
} 

Ce que cela fait est supprime TermQuery s avec le champ non-par défaut du BooleanQuery, et recurses vers le bas dans les requêtes sous-booléennes.

Notez que ce code n'est pas complet. En fonction de votre situation, vous pouvez vous soucier de plusieurs types de requêtes, telles que les requêtes de phrase et les requêtes de plage de scores constantes.

Assurez-vous de faire query.rewrite() avant d'appeler cette fonction, pour convertir toutes les requêtes génériques en requêtes booléennes.

Questions connexes