2009-06-10 22 views
5

Varsayılan bağlantı işleçini OR olarak bırakan Lucene'yi kullanarak bazı kodları kullanıyorum ve bunu AND olarak değiştirmek istiyorum. Bazı kodlar sadece bir QueryParser kullanır ve bu iyi - sadece bu örneklerde setDefaultOperator'ı çağırabilirim.Lucene MultiFieldQueryParser ile varsayılan bağlantı nasıl değiştirilir

Maalesef, bir yerde kod bir MultiFieldQueryParser kullanıyor ve statik "ayrıştırma" yöntemini çağırıyor (String, String [], BooleanClause.Occur [], Analyzer'ı alıyor), bu nedenle setDefaultOperator'ın yardımcı olamayacağı anlaşılıyor. çünkü bir örnek yöntemidir.

Aynı ayrıştırıcıyı kullanmaya devam etmenin bir yolu var mı, varsayılan bağlaç değişmiş mi?

cevap

8

MultiFieldQueryParser sınıfı, QueryParser sınıfını genişletir. Belki de bu sınıfın bir örneğini statik yöntemlerine güvenmek yerine basitçe yapılandırabilirsiniz? Gerçekten BooleanClause.Occur değerlerini yapılandırmanız gerekiyorsa, daha sonra bunu yapabilirsiniz.

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

Bu iyi teşekkürler. Eksik adım, daha sonra Occur değerlerinin nasıl yapılandırılacağıydı. Karşılaştığım diğer bir yaklaşım da, MultiFieldQueryParser.parse kodunun küçük olması, bu yüzden bunu uygulamaya yapıştırabilir ve değiştirebilirim. QueryParser örneklerini kendisi oluşturur, bu yüzden onlarla ilgili varsayılan operatörü ayarlamak için onu ayarlayabilirim. –

+0

Yinelenen döngü içinde, alan başına bağlantıyı değiştirmek için aşağıdakileri de kullanabilirsiniz: QueryParser ayrıştırıcısı = new QueryParser (Version.YOUR_VERSION, alanlar [i], new YourAnalyzer()); parser.setDefaultOperator (QueryParser.Operator.AND); clause.setQuery (parser.parse (clause.getQuery(). ToString (alanlar [i]))); – Ina

İlgili konular