Актуальность результатов поиска в Lucene - PullRequest
1 голос
/ 01 июля 2011

То, что я хочу:

В методе поиска я добавлю дополнительный параметр, скажем, параметр релевантности типа float, чтобы установить релевантность среза. Допустим, если пороговое значение составляет 60%, я хочу, чтобы релевантность была выше 60%.

Вот текущий код поиска:

говорят, что текст поиска и в файловой системе Lucene у меня есть следующее описание: 1) abcdef 2) аЬс 3) ABCD

на данный момент он получит все три вышеупомянутых документа, я хочу получить те, которые имеют релевантность выше 60%.

// на данный момент я нигде в методе не использую релевантность:

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 голосов
/ 16 ноября 2012

Вы можете легко сделать это, проигнорировав те попадания, у которых меньше TopDocs.MaxScore * minRelativeRelevance, где minRelativeRelevance должно быть значением от 0 до 1.

Я изменил ваш код, чтобы соответствовать 3.0.3 выпустила Lucene.Net и добавила FieldSelector к вашему звонку на IndexSearcher.Doc, чтобы избежать загрузки необязательных полей.

Вызов 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();
}
...