中和场上的得分

时间:2014-05-21 08:05:16

标签: .net lucene lucene.net

是否可以创建一个所有结果得分相同的searchQuery? 例: 我有一些我想要搜索的文档类型,我希望文档类型的匹配对分数没有任何影响。

(nodeTypeAlias:newsItem nodeTypeAlias:activity) 此查询为我提供了所有具有newsItem或activity为nodeTypeAlias的项目,但问题是活动项目的得分为2,7581,newsItem项目的得分为0,1061。这使得活动项目成为一个开端,而这是不需要的。

Ived尝试使用lucene.net来提升0,但是当传递给QueryParser时,它会将其转换为^ .0,并且lucene会在此类查询中断。

所以问题是:如何让字段搜索不影响分数,但是其他字段应该是(这些字段我实际上是用searchQuery搜索的)。

1 个答案:

答案 0 :(得分:0)

将查询或子查询包装在ConstantScoreQuery中,如:

Query constantQuery = new ConstantScoreQuery(nodeTypeAliasBQ);
booleanQuery.add(new BooleanClause(constantQuery, BooleanClause.Occur.MUST));
booleanQuery.add(new BooleanClause(someOtherQuery, BooleanClause.Occur.SHOULD));

在3.1之前,ConstantScoreQuery只能与Filter一起使用,而不能与Query一起使用。你可以通过几种方式做到这一点。

  1. 将查询换入QueryWrapperFilter

    Query constantQuery = new ConstantScoreQuery(new QueryWrapperFilter(nodeTypeBQ))
    

    有趣的事实:仍有代码支持/优化此模式,在源代码中注明:

      

    修复Lucene 2.x / early-3.x中过时的使用模式:因为ConstantScoreQuery只接受过滤器,所以QueryWrapperFilter用于包装查询。

  2. 使用TermsFilter

    Filter nodeTypeFilter = new TermsFilter();
    nodeTypeFilter.addTerm(new Term("nodeTypeAlias","newsItem"));
    nodeTypeFilter.addTerm(new Term("nodeTypeAlias","activity"));
    Query constantQuery = new ConstantScoreQuery(nodeTypeFilter)