Как я могу разбить объект Query на его логическое дерево примитивов? - PullRequest
1 голос
/ 25 декабря 2011

Скажите, если у меня есть запрос

content:table AND propertyfield:now

, как я могу получить два из этих предметов для надлежащего изучения позже?

1 Ответ

4 голосов
/ 25 декабря 2011

Вот, пожалуйста (я использую 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
...