嵌套禁止/要求运算符在Lucene搜索查询中

时间:2009-05-11 20:45:28

标签: java search parsing lucene

我正在使用Lucene for Java,并且需要弄清楚当我执行一些模糊的查询时引擎会做什么。请进行以下查询:

+(foo -bar)

如果我使用QueryParser来解析输入,我会得到一个如下所示的BooleanQuery对象:

org.apache.lucene.search.BooleanQuery:
    org.apache.lucene.search.BooleanClause(required=true, prohibited=false):
        org.apache.lucene.search.BooleanQuery:
            org.apache.lucene.search.BooleanClause(required=false, prohibited=false):
                org.apache.lucene.search.TermQuery: foo
            org.apache.lucene.search.BooleanClause(required=false, prohibited=true):
                org.apache.lucene.search.TermQuery: bar

Lucene在寻找什么?是文件必须包含'foo'但不能包含'bar'吗?如果我搜索:

怎么办?
-(foo +bar)

那些文件不能包含'foo'且不能包含'bar'吗?或者也许那些不能包含'foo'但必须包含'bar'的那些?

如果它有帮助,这就是我过去常常查看的QueryParser结果:

QueryParser parser = new QueryParser("contents", new StandardAnalyzer());
Query query = parser.parse(text);
debug(query, 0);

public static void debug(Object o, int depth) {
    for(int i=0; i<depth; i++) System.out.print("\t");
    System.out.print(o.getClass().getName());

    if(o instanceof BooleanQuery) {
        System.out.println(":");
        for(BooleanClause clause : ((BooleanQuery)o).getClauses()) {
            debug(clause, depth + 1);
        }
    } else if(o instanceof BooleanClause) {
        BooleanClause clause = (BooleanClause)o;
        System.out.println("(required=" + clause.isRequired() + ", prohibited=" + clause.isProhibited() + "):");
        debug(clause.getQuery(), depth + 1);
    } else if(o instanceof TermQuery) {
        TermQuery term = (TermQuery)o;
        System.out.println(": " + term.getTerm().text());
    } else {
        throw new IllegalArgumentException("Unknown object type");
    }
}

2 个答案:

答案 0 :(得分:1)

默认情况下,Lucene假定术语之间存在OR关系,因此第一个查询等同于

+(foo OR -bar)

将匹配包含(在默认字段中)“foo”或不包含“bar”的文档

在第二个查询中,“+”需要“bar”,这使得可选的“foo”变为冗余,因此它可以缩减为“-bar”,匹配所有不包含“bar”的文档< / p>

答案 1 :(得分:0)

Luke http://www.getopt.org/luke/对了解查询操作非常有用