Вы можете легко сделать это, проигнорировав те попадания, у которых меньше 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();
}