2009-06-10 14 views
5

Tengo un código usando Lucene que deja el operador de conjunción predeterminado como OR, y quiero cambiarlo a Y. Parte del código solo usa un QueryParser simple, y eso está bien, solo puedo llamar a setDefaultOperator en esas instancias.Cómo cambiar la conjunción predeterminada con Lucene MultiFieldQueryParser

Desafortunadamente, en un lugar el código usa un MultiFieldQueryParser, y llama al método estático "parse" (tomando String, String [], BooleanClause.Occur [], Analyzer), por lo que parece que setDefaultOperator no puede ayudar, porque es un método de instancia.

¿Hay alguna manera de seguir usando el mismo analizador pero cambiar la conjunción predeterminada?

Respuesta

8

La clase MultiFieldQueryParser amplía la clase QueryParser. ¿Quizás simplemente podría configurar una instancia de esta clase en lugar de confiar en sus métodos estáticos? Si realmente necesita configurar los valores BooleanClause.Occur, puede hacerlo luego.

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

Eso es bueno gracias. El paso que faltaba era cómo configurar los valores de Occur después. Otro enfoque con el que estoy jugando es que el código de MultiFieldQueryParser.parse es pequeño, así que podría pegarlo en mi aplicación y modificarlo. Crea instancias de QueryParser, así que puedo modificarlo para configurar el operador predeterminado en ellas. –

+0

Dentro del ciclo for iterated, también puede usar lo siguiente para cambiar la conjunción por campo: QueryParser parser = new QueryParser (Version.YOUR_VERSION, fields [i], new YourAnalyzer()); parser.setDefaultOperator (QueryParser.Operator.AND); clause.setQuery (parser.parse (clause.getQuery(). ToString (fields [i]))); – Ina

Cuestiones relacionadas