在分面搜索中自动向下钻取

时间:2012-07-23 13:32:08

标签: java lucene information-retrieval faceted-search

问题简介

我使用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,我只得到第一级的结果。

解决方案是首先获得第一级的结果,将具有最大权重的类别添加到路径,然后执行新的分面搜索,依此类推。但这效率很低!

谢谢!

1 个答案:

答案 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);