【问题标题】:Determine which parameter failed in a Lucene BooleanQuery?确定 Lucene BooleanQuery 中哪个参数失败?
【发布时间】:2014-04-04 03:10:52
【问题描述】:

如果整个查询没有返回结果,我需要确定 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);
}

【问题讨论】:

    标签: java lucene


    【解决方案1】:

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

    另一个可用的工具是获取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 是一个常用的查询,它也包含多个子查询,因此这种方法可能值得考虑。

    【讨论】:

    • 我添加了代码来创建我的PhraseQuery。该索引大约有 1300 万条记录。我不知道任何一个条目的具体文档 ID。我想要做的是记录任何不会产生结果的内容,以便稍后进行分析。
    • 看起来您正在以正确的方式接近PhraseQuery,但我仍然会担心那里的分析。例如,如果该字段使用StandardAnalyzer,如果没有在其他地方进一步规范化,标点符号、大写字符等可能会出现问题。
    • 它确实使用了StandardAnalyzer,但我在代码的其他地方删去了一个标点符号。所以我觉得我在那里没问题。谢谢!您提供的代码 sn-p 很有帮助。
    • 听起来您在PhraseQuery 上的想法是正确的,我的猜测当然可能是错误的。
    • 我实现了你的代码,我发现,正如你所预测的,PhraseQuery 是导致大多数BooleanQueries 失败的原因。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 2021-04-18
    • 2020-04-08
    • 1970-01-01
    相关资源
    最近更新 更多