1

问题简介

我使用 Apache 的 Lucene for java,我想知道如何在多面搜索中自动向下钻取。更准确地说,我想,给定一个分类级别,得到那个级别的各个方面。例如,如果我将 Open Directory 项目用作分类法,并且我在第 2 级寻找剧院,我想在分类法中下钻,采用更重要的路径。在这种情况下:艺术->表演艺术。这样我就可以对 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,我只会得到第一级的结果。

一个解决方案是首先获取第一级的结果,将具有最大权重的类别添加到路径中,然后执行新的分面搜索等等。但这非常低效!

谢谢!

4

1 回答 1

1

实际上,您不只是获得第一级,lucene 返回所有级别,但您需要使用 getSubResults 方法从 facetCollector 结果中获取它们。它实际上可以通过这种方式获得类别路径中的所有级别。除非您想提供对整个集合的深入分析,否则使用 MatchAllDocs 并不是那么好。使用多收集器并提供一些查询或过滤时间来限制您的结果可能更合适。

使用下面的代码片段,您可以遍历所有结果和所有子结果以找到您要查找的类别路径,然后在第一个查询上使用 DrillDown 查询

例如:

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);
于 2013-02-04T09:07:13.257 回答