gpt4 book ai didi

java - 测试 Lucene Query 是否匹配所有文档

转载 作者:行者123 更新时间:2023-11-30 11:25:12 25 4
gpt4 key购买 nike

给定一个 Query 的实例,是否有可能以某种方式检查该实例是否恰好表示一个始终与索引中的所有文档匹配的查询?

例如,包含 MatchAllDocs 子句的 MatchAllDocsQueryBooleanQuery 就是这样的查询,它们总是返回所有文档。另一个例子是一个 BooleanQuery,它有一个 SHOULD-match 子句,该子句有一个嵌套的 SHOULD-match 子句,里面有一个 MatchAllDocs

请注意,由于其中包含所有可能的术语或索引为空而恰好返回所有内容的查询不算作始终返回所有文档的查询。换句话说,我想检查给定的查询是否总是返回所有内容,无论索引包含什么。

有可能吗,或者至少是大概有可能吗?如果它适用于可以从 Solr's Extended Dismax Query Parser 返回的任何查询,我将接受一个不适用于任何可能情况的解决方案的答案。 .

最佳答案

包含 MatchAllDocsQuery 作为子句之一的 BooleanQuery 不一定返回所有文档,因为 BooleanQuery 还可能包含其他MUSTMUST_NOT 子句会限制结果集。我不相信有什么东西可以开箱即用,并且尝试处理 Solr 可能拆分出来的任何类型的查询都会很困难。您需要递归地遍历查询,以确保所有内容都有效地简化为 MatchAllDocsQuery,忽略分数。

类似的东西(目前还完全未经测试):

boolean willMatchAll(Query query) {
if (query instanceof MatchAllDocsQuery)
return true;
}
else if (query instanceof BooleanQuery) {
boolean foundMatchAll = false;
for (BooleanClause clause : ((BooleanQuery)query).getClauses()) {
if (clause.isProhibited()) {
return false; //A reasonable assumption, that the MUST_NOT clauses won't be empty
}
else if (clause.isRequired()) {
if (willMatchAll(clause.getQuery())) {
foundMatchAll = true;
} else {
return false; //any MUST clause that is not a matchall means the boolean query will not match all
}
}
else {
if (willMatchAll(clause.getQuery())) {
foundMatchAll = true;
}
}
}
//If a matchall has been found, and we haven't return false yet, this boolean query matches all documents
return foundMatchAll;
}
else if (query instanceof DisjunctionMaxQuery) {
boolean isMatchAll = false
//If any disjunct is a matchall, the query will match all documents
for (Query subquery : ((DisjunctuionMaxQuery)query).getDisjuncts()) {
isMatchAll = isMatchAll || willMatchAll(subquery);
}
return isMatchAll;
}
else if (query instanceof ConstantScoreQuery) {
//Traverse right through ConstantScoreQuery. The wrapper isn't of interest here.
Query subquery = ((ConstantScoreQuery)query).getQuery()
if (subquery == null) {
return false; //It wraps a filter, not a query, and I don't believe a filter can be a matchall
}
return willMatchAll(subquery);
}
else {
//No other standard queries may be or contain MatchAllDocsQueries, I don't believe.
//Even a double open-ended range query restricts the results to those with a value in the specified field.
return false;
}
}

如果你还想处理 org.apache.lucene.queries 中的内容,将会有更多查询类型需要处理,例如 BoostingQueryCustomScoreQuery 等。但希望这能给出一些想法。

关于java - 测试 Lucene Query 是否匹配所有文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20371364/

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