我正在尝试在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/