我正在使用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类中的很多东西,所以我真的需要一个输入才能继续前进。有人知道吗?
答案 0 :(得分:1)
您可以通过使用多个布尔查询来实现此目的。 我假设结果“必须”匹配过滤器。
// 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);
答案 1 :(得分:0)
我解决了这个问题!我使用了@ 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);
谢谢大家!