Lucene 5.2.1 中的过滤问题

Filtering problems in Lucene 5.2.1

我正在使用 lucene 5.2.1,我正在尝试过滤查询结果。我不想添加 Occur.SHOULD 子句,因为我不想过滤器影响检索到的文档的排名(我只需要过滤器来删除不正确的文档)。尽管如此,我还是想使用我自己的排序规则对查询结果进行排序。直到现在我有这段代码:

BooleanQuery bq = ... //user's query + filters    
maxdocs = 50;
SortField[] fields = {SortField.FIELD_SCORE, new SortField("stars", SortField.Type.DOUBLE, true)};
Sort sort = new Sort(fields);
TopDocs docs = mySearcher.search(bq, maxdocs, sort);

其中 bq 是包含实际用户查询(Occur.MUST 和 Occur.SHOULD 子句)和过滤器(Occur.FILTER 子句)的 BooleanQuery。例如,我将 "category" 字段上的过滤器添加到 bq,如下所示:

if (category.length() > 0) {
        categoryParser = new QueryParser("categories", businessAnalyzer);
        categoryParser.setAllowLeadingWildcard(true);
        categoryParser.setLowercaseExpandedTerms(true);
        categoryParser.setAutoGeneratePhraseQueries(true);
        categoryQuery = categoryParser.parse("*" + category + "*");         
        bq.add(categoryQuery, Occur.FILTER);
    }

过滤器实际上并没有很好地工作(我总是得到 0 个结果)所以我一定是遗漏了什么。我还尝试了使用 Filter、QueryWrapperFilter 和 FilteredQuery 的不同方法,但它仍然 returns 0 个结果:

//filters contains the previous bq.add(category_filter, Occur.FILTER);    
Filter filter = new QueryWrapperFilter(filters);    
FilteredQuery filtered_query = new FilteredQuery(bq, filter);

我已阅读 documentation,我想我的问题是我想同时应用过滤器和排序。但是 class 过滤器中的很多东西都被弃用了,所以我真的需要一个输入来继续前进。有人知道吗?

您可以通过使用多个布尔查询来实现这一点。 我假设结果 "must" 与过滤器匹配。

// Your user query, which contains both Occur.SHOULD and Occur.MUST clauses
BooleanQuery userQuery = createUserQuery();

// Your filter query, could be a BooleanQuery on its own
Query filterQuery = getFilterQuery();

BooleanQuery finalQuery = new BooleanQuery();
finalQuery.add(userQuery, Occur.MUST);
finalQuery.add(filterQuery, Occur.FILTER);
// Search using the finalQuery
TopDocs docs = mySearcher.search(finalQuery, maxdocs, sort);

问题我解决了!我都使用了 @user1071777 建议的 finalQuery,并检查了 @femtoRgon 建议的 categoryQuery。 categoryQuery 给我带来了问题,因为我解析它时将通配符添加到输入字符串中,如下所示:

categoryParser = new QueryParser("categories", myAnalyzer);
categoryParser.setAllowLeadingWildcard(true);
categoryParser.setLowercaseExpandedTerms(true);
categoryParser.setAutoGeneratePhraseQueries(true);
//NOT WORKING: categoryQuery = categoryParser.parse("*" + category + "*");          
categoryQuery = categoryParser.parse(category); 
filters.add(categoryQuery, Occur.SHOULD);

似乎不​​允许添加那些通配符。 你可以找到我上面的代码的更新版本,它有效!

BooleanQuery finalQuery = new BooleanQuery();
Query filters = ... //add filter clauses to filter query
finalQuery.add(bq, Occur.MUST); //bq is still the user's boolean query 
finalQuery.add(filters, Occur.FILTER);

谢谢大家!