我有一个索引,我需要使用标准搜索获取所有文档,仍然按相关性进行排名,即使文档不是命中。
我的第一个想法是添加一个始终匹配的字段,但这可能会影响相关性分数。
答案 0 :(得分:2)
使用BooleanQuery
将原始查询与MatchAllDocsQuery
合并。通过将MatchAllDocsQuery
上的提升设置为零,然后将其与主查询结合使用,可以减轻这对评分的影响。这样您就不必在索引中添加其他伪造字段。
例如:
// Parse a query by the user.
QueryParser qp = new QueryParser(Version.LUCENE_35, "text", new StandardAnalyzer());
Query standardQuery = qp.parse("User query may go here");
// Make a query that matches everything, but has no boost.
MatchAllDocsQuery matchAllDocsQuery = new MatchAllDocsQuery();
matchAllDocsQuery.setBoost(0f);
// Combine the queries.
BooleanQuery boolQuery = new BooleanQuery();
boolQuery.add(standardQuery, BooleanClause.Occur.SHOULD);
boolQuery.add(matchAllDocsQuery, BooleanClause.Occur.SHOULD);
// Now just pass it to the searcher.
这可以让你从standardQuery
点击,然后是索引中的其他文档。