与Lucene的搜索结果相关

时间:2011-07-01 09:18:49

标签: c#-4.0 lucene.net

我想要的是:

在搜索方法中,我将添加一个额外的参数,表示float类型的相关参数,以设置cuttoff相关性。因此,假设截止值为60%,我希望项目的相关性高于60%。

以下是当前的搜索代码:

说搜索文本是 在lucene文件系统中我有以下描述: 1)abcdef 2)ABC 3)ABCD

目前它将获取以上所有三个文档,我想获取那些高于60%相关性的文档。

//现在我没有在方法中的任何地方使用correlationparam:

public static string[] Search(string searchText,float relevanceparam)
        {
            //List of ID
            List<string> searchResultID = new List<string>();

            IndexSearcher searcher = new IndexSearcher(reader);
            Term searchTerm = new Term("Text", searchText);
            Query query = new TermQuery(searchTerm);
            Hits hits = searcher.Search(query);
            for (int i = 0; i < hits.Length(); i++)
            {
                float r = hits.Score(i);
                Document doc = hits.Doc(i);

                searchResultID.Add(doc.Get("ID"));
            }
            return searchResultID.ToArray();
        }

修改:

如果我为我的查询设置了提升,该怎么办? 说:query.SetBoost(1.6); - 这相当于60%?

1 个答案:

答案 0 :(得分:0)

您可以通过忽略小于TopDocs.MaxScore * minRelativeRelevance的匹配来轻松完成此操作,其中minRelativeRelevance应该是介于0和1之间的值。

我修改了您的代码以匹配Lucene.Net的3.0.3版本,并在调用IndexSearcher.Doc时添加了一个FieldSelector,以避免加载非必填字段。

调用Query.SetBoost(1.6)只会意味着该查询计算得分将提高60%(乘以1.6)。如果涉及其他查询(例如,在BooleanQuery中),它可能会更改结果的顺序,但它不会更改返回的结果。

public static String[] Search(IndexReader reader, String searchText, 
                              Single minRelativeRelevance) {
    var resultIds = new List<String>();

    var searcher = new IndexSearcher(reader);
    var searchTerm = new Term("Text", searchText);
    var query = new TermQuery(searchTerm);
    var hits = searcher.Search(query, 100);

    var minScore = hits.MaxScore * minRelativeRelevance;
    var fieldSelector = new MapFieldSelector("ID");
    foreach (var hit in hits.ScoreDocs) {
        if (hit.Score >= minScore) {
            var document = searcher.Doc(hit.Doc, fieldSelector);
            var hitId = document.Get("ID");
            resultIds.Add(hitId);
        }
    }

    return resultIds.ToArray();
}