- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
问题简介
我使用 Apache 的 Lucene for java,我想知道如何在分面搜索中自动向下钻取。更准确地说,我想根据给定的分类级别,获取该级别的各个方面。例如,如果我使用开放目录项目作为分类法,并且在级别 2 上查找“剧院”,我想在分类法中深入挖掘,采用更重要的路径。在本例中:艺术->表演艺术。这样我就可以对 Performing_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,我只会获得第一级的结果。
解决方案是首先获取第一级的结果,将具有最大权重的类别添加到路径中,然后执行新的分面搜索,依此类推。但这是非常低效的!
谢谢!
最佳答案
实际上你不只是获得第一个级别,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);
关于java - 分面搜索中的自动深入分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11613551/
在开始本文前先考虑以下一个问题 在不使用任何带有自动补全功能IDE的情况下,如何获取一个数组的长度?以及,如何获取一个字符串的长度? 这个问题我问过不同水平的程序员,包括初级和中级水平的。他们都
spool--导出sql语句结果集 SQL>spool c:\testsql.sql SQL>SELECT * FROM table_name; SQL>spool off;
在面向对象的C++语言中,虚函数(virtual function)是一个非常重要的概念。因为它充分体现 了面向对象思想中的继承和多态性这两大特性,在C++语言里应用极广。比如在微软的MFC类库中,
在查询语句中使用 NOLOCK 和 READPAST 处理一个数据库死锁的异常时候,其中一个建议就是使用 NOLOCK 或者 READPAST 。有关 NOLOCK 和 READPAST
我正在尝试使用 espn 公共(public) API 并尝试使用他们的 json 来访问 NFL 球员信息。 我成功访问的 json 如下所示: { "sports": [ {
前面跟小伙伴们分享了 SpringMVC 一个大致的初始化流程以及请求的大致处理流程,在请求处理过程中,涉及到九大组件,分别是: HandlerMapping Hand
Automatic Workload Repository 是 10g 引入的一个重要组件 存贮着近期一段时间内数据库活动状态的详细信息、信息保留默
我一直坚持使用 ng-repeat 显示数据。我唯一能做的就是显示两个对象之一。每个客户可以有多个用户。我正在尝试在具有 CustomerId 的表中显示用户。 Working plunkr app.
对我来说,下面的 Java 代码是完全有效的,风格很好: enum Side { LEFT, RIGHT }; ... Side side = ...; switch (side) { case LE
我是一名优秀的程序员,十分优秀!