问题简介
我使用Apache的Lucene for java,我想知道如何在分面搜索中自动向下钻取。更确切地说,我想,在分类标准的基础上,获得该级别的方面。例如,如果我使用开放式目录项目作为taoxnomy并且我在2级寻找影院,我想深入研究分类标准,并采用更重要的路径。在这种情况下:Arts-> perform_arts。通过这种方式,我可以在perform_arts中搜索类别。
问题
我知道很热门进行分面搜索。在上面的例子中,我会这样做:
// 2. Query expansion
IndexSearcher wnSearcher = new IndexSearcher(wnReader);
//Query q = SynLookup.expand(querystr, wnSearcher, analyzer, "Contents", (float) 0.9);
// 3. Query
// the "title" arg specifies the default field to use
// when no field is explicitly specified in the query.
Query q = new QueryParser(Version.LUCENE_36, "Contents", analyzer).parse(querystr);
// 3. search
Query matchAllDocs= new MatchAllDocsQuery();
// Create the facets collector
FacetIndexingParams indexingParams = new DefaultFacetIndexingParams();
FacetSearchParams facetSearchParams = new FacetSearchParams(indexingParams);
CategoryPath top = new CategoryPath("Top/Arts/performing_arts",'/');
FacetRequest neighborhoodFacetRequest = new CountFacetRequest(top, 13);
facetSearchParams.addFacetRequest(neighborhoodFacetRequest);
FacetsCollector fc = new FacetsCollector(facetSearchParams, reader, taxonomyReader);
IndexSearcher searcher = new IndexSearcher(reader);
searcher.search(q, new QueryWrapperFilter(matchAllDocs), fc);
// 4. display results
System.out.println("Results: ");
List<FacetResult> res = fc.getFacetResults();
printFacetResult(res);
但是,我必须先了解创建CategoryPath的路径......而且我不知道如何获得整个结果集然后达到我想要的水平。如果我将CategoryPath设置为Top,我只得到第一级的结果。
解决方案是首先获得第一级的结果,将具有最大权重的类别添加到路径,然后执行新的分面搜索,依此类推。但这效率很低!
谢谢!
答案 0 :(得分:1)
实际上你不只是获得第一级,lucene返回所有级别,但你需要使用getSubResults方法从facetCollector结果中获取它们。它实际上可以通过这种方式获得类别路径中的所有级别。除非你想在整个集合中提供深入分析,否则使用MatchAllDocs并不是那么好。使用多收集器并提供一些查询或过滤时间来限制结果可能更合适。
使用下面的代码片段,您可以遍历所有结果,并查看所有子结果以查找您要查找的类别路径,然后在第一个查询中使用DrillDown查询
e.g:
for (FacetResult res : fc.getFacetResults()){
//this is the top lvl facet
FacetResultNode toplvl = res.getFacetResultNode();
System.out.println(toplvl.getLabel() + " (" + toplvl.getValue() + ")");
for (FaceResultNode secondlvl : toplvl.getSubResults()) {
//second lvl facet categories
System.out.println(" " + secondlvl.getLabel().getComponent(1)
+ " (" + secondlvl.getValue() + ")");
}
}
//your orginal query 'q' + the your cat
Query q2 = DrillDown.query(indexingParams, q, cat);