java - Lucene 5.2.1 中的过滤问题

标签 java filter lucene

我正在使用 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/

相关文章:

search - ElasticSearch - 更新或新索引?

java - 将scala引入现有的netbeans java项目

java - 我可以在 Java 中覆盖和重载静态方法吗?

python Pandas : How to filter a dataframe with more than one expression stored in different variables?

sql - 我如何在我的 SQL Server Profiler 上关闭来自 "Report Server"的行?

solr - 我如何使用 lucene 查询找到空的 Solr 文档字段

java - 返回对象的对话框

java - Android InputStream 无法接收来自蓝牙 HC-05 的完整消息

arrays - 用一个条件过滤多个数组

python - 将一种查询格式解析为另一种格式