2013-02-04 28 views
2

是否可以设置在Lucene中返回结果的最低分数?Lucene.net/Lucene中的最低分数?

我有这样的功能:

public Tuple<int,ICollection<Guid>> Search(string searchQuery,int maxResults) 
{ 
    var booleanQuery = new BooleanQuery(); 
    var s1 = new TermQuery(new Term("companyName", searchQuery)); 
    booleanQuery.Add(s1, Occur.SHOULD); 

    using (var searcher = new IndexSearcher(this.Directory)) 
    { 
     TopDocs hits = searcher.Search(booleanQuery, maxResults); 

     var ids = new List<Guid>(); 
     for (int i = 0; i < hits.ScoreDocs.Count(); i++) 
     { 
      var idString = searcher.Doc(hits.ScoreDocs[i].Doc).Get("id"); 
      ids.Add(new Guid(idString)); 
     } 
     return new Tuple<int, ICollection<Guid>>(hits.TotalHits, ids); 
    } 
} 

功能搜索我的索引,并返回匹配SEARCHQUERY,与符合搜索公司总数沿着公司的ID - 这样我就可以写“显示245个匹配公司中的1-20个'。

我的问题是,匹配的门槛非常低。如果用户输入“会计师”,则搜索返回有意义的结果,但是如果他们输入“adasdfsdf”,则返回不相关的结果。如果结果不够相关,我宁愿显示“抱歉,没有公司符合您的查询”等消息。

是否可以设置比赛的最低分数? TopDocs.TotalHits物业会尊重这个分数吗?

回答

5

总之,没有。您无法在Lucene中创建最低分数截止点。这里是一个discussion of why not。请注意,这里讨论的情况与您所要求的有些不同,但困难大同小异(实际上,为不同的独立查询提供合理的截止点会引入更大但密切相关的问题,困难)。

解决这个问题的更好的方法是设计你的查询,这样你就不会得到不相关的结果。在你的例子中,我不明白为什么你会看到很多不相关的结果,所以我会假设有其他条件被添加到查询中。在这种情况下,如果你只是想获得这些文件对于这new Term("companyName", searchQuery)匹配,你应该用Occur.MUST booleanClause添加它,如:

var booleanQuery = new BooleanQuery(); 
var s1 = new TermQuery(new Term("companyName", searchQuery)); 
booleanQuery.Add(s1, Occur.MUST); 

为了进一步解释,在Occur.MUSTOccur.SHOULD是你的问题在那里。如果你有这样的查询:

category:type1 companyName:asdfdas 

,并且对的companyName没有结果,那么你会只看到结果查询category:type1。如果您确实在companyName上有匹配关系,那么这些结果将被判断为具有更高的相关性,并且会首先显示,但它仍然会显示与该类别相匹配的所有内容,只是在列表中较低。在这个例子中,这两个术语都与BooleanClause.Occur.SHOULD一起添加,因此两者都是可选的(尽管在任何结果中都必须至少找到一个匹配的术语)。

如果您希望仅显示与类别和公司名称相匹配的条款,则应使用BooleanClause.Occur.MUST在查询中使它们都为必填条件。使用查询语法,这看起来像:

+category:type1 +companyName:asdfdas 

或建造的BooleanQuery:

var s1 = new TermQuery(new Term("companyName", "asdfdas")); 
booleanQuery.Add(s1, Occur.MUST); 
var s1 = new TermQuery(new Term("category", "type1")); 
booleanQuery.Add(s1, Occur.MUST); 
+0

你说得对,有查询更多条款 - 像类别和说明的东西。尽管如此,我不明白为什么我仍然会遇到大量不相关的结果。我会尝试阅读lucene使用的算法。 – Oliver