gpt4 book ai didi

java - 确定 Lucene BooleanQuery 中哪个参数失败?

转载 作者:行者123 更新时间:2023-12-01 13:11:18 35 4
gpt4 key购买 nike

如果整个查询没有返回结果,我需要确定 Lucene BooleanQuery 的哪一部分失败。

我使用的是由 4 个 NumericRangeQueries 和一个 PhraseQuery 组成的 BooleanQuery。每个都通过 Occur.MUST 添加到查询中。

如果我没有得到任何查询结果,是否有办法判断查询的哪一部分未能匹配任何内容?我是否需要单独运行查询并比较结果以获得失败的查询?

编辑 - 添加了 PhraseQuery 代码。

if( row.getPropertykey_tx() != null && !row.getPropertykey_tx().trim().isEmpty()){
PhraseQuery pQuery = new PhraseQuery();
String[] words = row.getPropertykey_tx().trim().split(" ");
for( String word : words ){
pQuery.add(new Term(TitleRecordColumns.SA_SITE_ADDR.toString(), word));
}
pQuery.setSlop(2);

topBQuery.add(pQuery, BooleanClause.Occur.MUST);
}

最佳答案

在我看来,运行查询的各个部分可能是最简单的方法。

另一个可用的工具是获取 Explaination 。您可以调用 IndexSearcher.explain 获取针对特定文档的查询评分的说明。如果您可以提供您认为应该与查询匹配的文档的 docid,则可以分析 Explanation.toString (或者 toHtml ,如果您愿意的话)来确定哪些子查询不匹配它。

<小时/>

如果您想自动记录 BooleanQuery 的哪个子句不产生结果,我相信您将需要独立运行每个查询。如果您不再有权访问用于创建它的子查询,您可以改为获取它的子句:

findTroublesomeQuery(BooleanQuery query) {
for (BooleanClause clause : query.clauses()) {
Query subquery = clause.getQuery()
TopDocs docs = searchHoweverYouDo(subquery);
if (doc.totalSize == 0) {
//If you want to dig down recursively...
if (subquery instanceof BooleanQuery)
findTroublesomeQuery(query);
else
log(query); //Or do whatever you want to keep track of it.
}
}
}

DisjunctionMaxQuery 是一种常用的查询,它也包装多个子查询,因此可能值得考虑这种方法。

关于java - 确定 Lucene BooleanQuery 中哪个参数失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22845513/

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