我正在尝试在Lucene中进行深度搜索以获取我的资源。

        Query q1 = new MultiFieldQueryParser(new String[] { "products",
                "name"}, analyzer).parse(queryStr1);
        Query q2 = new TermQuery(new Term("keywords", queryStr2));
        IndexReader ir = DirectoryReader.open(indexLocation);
        IndexSearcher is = new IndexSearcher(ir);
        TopScoreDocCollector collector = TopScoreDocCollector.create(
                reqHits, true);

        is.search(q1, collector);
        ScoreDoc results[] = collector.topDocs().scoreDocs;
        TopDocs topDocs = null;
        for (ScoreDoc scoreDoc : results) {
            topDocs = is.searchAfter(scoreDoc, q2, 1);
        }
        ScoreDoc deepResults[] = topDocs.scoreDocs;
        for (int i = 0; i < deepResults.length; i++) {
            Document doc = is.doc(deepResults[i].doc);
            System.out.println(doc.get("name"));
        }


searchAfter()可以应用于先前搜索的scoreDocs,但是它需要将scoreDoc作为第一个参数,因此我循环执行以获取单个scoreDoc。我不确定如何应用afterSearch来获得预期的结果,因为我的代码没有给我预期的结果。
提前致谢。

最佳答案

有两种方法可以在q2的结果中搜索q1的结果。

最简单的方法是将两个查询与布尔查询结合起来:

BooleanQuery finalQuery = new BooleanQuery();
finalQuery.add(q1, BooleanClause.Occur.MUST);
finalQuery.add(q2, BooleanClause.Occur.MUST);
is.search(finalQuery, collector);


即使您的用例是从q1获取并显示结果,然后将q2作为用户的输入,然后运行另一个搜索,保留q1并生成BooleanQuery,因为最终查询仍然存在一个好方法。

您也可以对其中一个查询使用。如果其中之一(例如Filter)是您希望经常重用的查询,并且将从缓存查询结果中受益,则该功能特别有用,例如:

Filter q1Filter = new CachingWrapperFilter(new QueryWrapperFilter(q1));
is.search(q2, q1Filter, collector);

关于java - 在lucene中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27399266/

10-14 12:23