gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:20:26 25 4
gpt4 key购买 nike

我正在使用 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");
}
}

最佳答案

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

+(foo OR -bar)

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

在第二个查询中,“+”使得“bar”成为必需,这使得可选的“foo”变得多余,因此可以将其简化为“-bar”,匹配所有不包含“bar”的文档

关于java - Lucene 搜索查询中的嵌套禁止/要求运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/850020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com