2009-03-12 4 views
0

Si j'ai une chaîne de requête LuceneObtenez les noms de champs à partir d'une chaîne de requête Lucene

"field1:value1 myField:aValue" 

Est-il possible de laisser Lucene analyser ce que je peux obtenir des requêtes terme?
En fin de compte, je veux pouvoir ramener les noms de champs et leurs valeurs à mes données de vue afin que je puisse les remplir dans mes zones de texte lors de la publication.

Répondre

2

La chaîne QueryParser de lucene convertira cette chaîne en BooleanQuery contenant deux clauses TermQuery. Vous devrez utiliser la méthode getClauses de BooleanQuery pour obtenir les requêtes de termes.

1

J'ai fait face à une exigence similaire, mais la requête peut être générique. Apparu avec la méthode ci-dessous (implémenté en Java). Code complet https://github.com/atulsm/Test_Projects/blob/master/src/TestLuceneQueryStringFields.java

private static Set<String> calculateQueryFieldsRecursively(Query query) throws ParseException{ 
    Set<String> fields = new HashSet<String>(); 

    if(query instanceof TermQuery){ 
     TermQuery tQuery = (TermQuery)query;    
     Term term = tQuery.getTerm(); 
     fields.add(term.field()); 
    } else if(query instanceof BooleanQuery){ 
     BooleanQuery bQuery = (BooleanQuery)query; 
     List<BooleanClause> clauses = bQuery.clauses(); 
     for(BooleanClause clause: clauses){ 
      Query innerQuery = clause.getQuery(); 
      Set<String> innerFields = calculateQueryFieldsRecursively(innerQuery); 
      if(innerFields == null){ 
       return null; 
      }else{ 
       fields.addAll(innerFields); 
      } 
     } 
    } else { //TODO support more lucene query types 
     return null; 
    } 
    return fields; 
} 
Questions connexes