gpt4 book ai didi

java - Lucene 5.2.1 中的过滤问题

转载 作者:行者123 更新时间:2023-11-30 08:02:34 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com