Вот, пожалуйста (я использую Java, извините;)
package stack.lucene;
import junit.framework.TestCase;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.util.Version;
public class StackLucene2 extends TestCase
{
private String sQuery = "field1:playing AND (field2:curse OR field3:something) AND field4:somethingother OR field5:blah";
public void testQueryParser() throws Exception
{
QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, null, new StandardAnalyzer(Version.LUCENE_CURRENT));
Query q = parser.parse(this.sQuery);
if( q.getClass() == BooleanQuery.class ){
breakQuery_recursive(q, 0);
}
}
// level is for indentation
private void breakQuery_recursive(Query q, int level)
{
BooleanQuery castQuery = (BooleanQuery)q;
for(BooleanClause clause : castQuery.getClauses() ){
Class queryclazz = clause.getQuery().getClass();
System.out.println(repeat(' ', level) + "["+queryclazz+"][" + clause.getOccur() + "] " + clause.toString());
if(queryclazz == BooleanQuery.class) {
breakQuery_recursive(clause.getQuery(), level+1);
}
}
}
private String repeat(char c, int times)
{
StringBuffer b = new StringBuffer();
for(int i=0;i < times;i++){
b.append(c);
}
return b.toString();
}
}
Выход:
[class org.apache.lucene.search.TermQuery][+] +field1:playing
[class org.apache.lucene.search.BooleanQuery][+] +field2:curse field3:something
[class org.apache.lucene.search.TermQuery][] field2:curse
[class org.apache.lucene.search.TermQuery][] field3:something
[class org.apache.lucene.search.TermQuery][+] +field4:somethingother
[class org.apache.lucene.search.TermQuery][] field5:blah