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);
谢谢大家!
我正在使用 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);
谢谢大家!