我正在使用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");
}
}
答案 0 :(得分:1)
默认情况下,Lucene假定术语之间存在OR关系,因此第一个查询等同于
+(foo OR -bar)
将匹配包含(在默认字段中)“foo”或不包含“bar”的文档
在第二个查询中,“+”需要“bar”,这使得可选的“foo”变为冗余,因此它可以缩减为“-bar”,匹配所有不包含“bar”的文档< / p>
答案 1 :(得分:0)
Luke http://www.getopt.org/luke/对了解查询操作非常有用