过滤Lucene 5.2.1中的问题

时间:2015-07-28 13:12:55

标签: 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类中的很多东西,所以我真的需要一个输入才能继续前进。有人知道吗?

2 个答案:

答案 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);

谢谢大家!