我正在使用 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 是一个 BooleanQuery,包含实际用户的查询(Occur.MUST 和 Occur.SHOULD 子句)和过滤器(Occur.FILTER 子句)。例如,我将“类别”字段上的过滤器添加到 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 的不同方法,但它仍然返回 0 个结果:
//filters contains the previous bq.add(category_filter, Occur.FILTER);
Filter filter = new QueryWrapperFilter(filters);
FilteredQuery filtered_query = new FilteredQuery(bq, filter);
我已阅读 documentation ,我想我的问题是我想同时应用过滤器和排序。但是 Filter 类中的很多内容已被弃用,所以我确实需要一个输入才能继续前进。有人知道吗?
最佳答案
您可以通过使用多个 boolean 查询来实现此目的。 我假设结果“必须”与过滤器匹配。
// 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);
关于java - Lucene 5.2.1 中的过滤问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31677394/