2011-12-25 57 views

回答

4

在這裏你去(我使用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