2009-06-10 7 views
5

Ho un po 'di codice utilizzando Lucene che lascia l'operatore di congiunzione predefinito come OR e voglio cambiarlo in AND. Alcuni codici usano solo un semplice QueryParser, e va bene - posso semplicemente chiamare setDefaultOperator su quelle istanze.Come modificare la congiunzione predefinita con Lucene MultiFieldQueryParser

Sfortunatamente, in un punto il codice utilizza un MultiFieldQueryParser e chiama il metodo statico "parse" (prendendo String, String [], BooleanClause.Occur [], Analyzer), quindi sembra che setDefaultOperator non possa aiutare, perché è un metodo di istanza.

C'è un modo per continuare a utilizzare lo stesso parser ma è stata modificata la congiunzione predefinita?

risposta

8

La classe MultiFieldQueryParser estende la classe QueryParser. Forse potresti semplicemente configurare un'istanza di questa classe piuttosto che fare affidamento sui suoi metodi statici? Se è davvero necessario configurare i valori BooleanClause.Occur, è possibile farlo in seguito.

String queryString = ...; 
String[] fields = ...; 
Analyzer analyzer = ...; 

MultiFieldQueryParser queryParser = new MultiFieldQueryParser(fields, analyzer); 
queryParser.setDefaultOperator(QueryParser.Operator.AND); 

Query query = queryParser.parse(queryString); 

// If you're not happy with MultiFieldQueryParser's default Occur (SHOULD), you can re-configure it afterward: 
if (query instanceof BooleanQuery) { 
    BooleanClause.Occur[] flags = ...; 
    BooleanQuery booleanQuery = (BooleanQuery) query; 
    BooleanClause[] clauses = booleanQuery.getClauses(); 
    for (int i = 0; i < clauses.length; i++) { 
     clauses[i].setOccur(flags[i]); 
    } 
} 
+0

Va bene, grazie. Il passaggio mancante era come configurare i valori di occorrenza in seguito. Un altro approccio con cui sto giocando è che il codice per MultiFieldQueryParser.parse è piccolo, quindi potrei semplicemente inserirlo nella mia applicazione e modificarlo. Crea istanze di QueryParser stesso, quindi posso semplicemente modificarlo per impostare su di esse l'operatore predefinito. –

+0

All'interno del ciclo for iterato, è anche possibile utilizzare quanto segue per modificare la congiunzione per campo: parser QueryParser = new QueryParser (Version.YOUR_VERSION, campi [i], nuovo YourAnalyzer()); parser.setDefaultOperator (QueryParser.Operator.AND); clause.setQuery (parser.parse (clause.getQuery(). ToString (fields [i]))); – Ina

Problemi correlati