Удалить результаты ниже определенного порогового значения в Solr/Lucene?
Есть ли встроенные функции в solr/lucene для фильтрации результатов, если они опускаются ниже определенного порогового значения? Скажем, если я предоставил порог оценки .2, то все документы со счетом менее 0,2 будут удалены из моих результатов. Моя интуиция заключается в том, что это возможно путем обновления/настройки solr или lucene.
Не могли бы вы указать мне в правильном направлении, как это сделать?
Спасибо заранее!
Ответы
Ответ 1
Вы можете написать свой собственный коллекционер, который проигнорировал бы сбор тех документов, которые бомбардир помещает ниже вашего порога. Ниже приведен простой пример использования Lucene.Net 2.9.1.2 и С#. Вам нужно будет изменить пример, если вы хотите сохранить вычисленный балл.
using System;
using System.Collections.Generic;
using Lucene.Net.Index;
using Lucene.Net.Search;
public class ScoreLimitingCollector : Collector {
private readonly Single _lowerInclusiveScore;
private readonly List<Int32> _docIds = new List<Int32>();
private Scorer _scorer;
private Int32 _docBase;
public IEnumerable<Int32> DocumentIds {
get { return _docIds; }
}
public ScoreLimitingCollector(Single lowerInclusiveScore) {
_lowerInclusiveScore = lowerInclusiveScore;
}
public override void SetScorer(Scorer scorer) {
_scorer = scorer;
}
public override void Collect(Int32 doc) {
var score = _scorer.Score();
if (_lowerInclusiveScore <= score)
_docIds.Add(_docBase + doc);
}
public override void SetNextReader(IndexReader reader, Int32 docBase) {
_docBase = docBase;
}
public override bool AcceptsDocsOutOfOrder() {
return true;
}
}
Ответ 2
Он назвал нормализованный балл (Оценка как проценты).
Для этого вы можете использовать следующие параметры:
ns = {!func}product(scale(product(query({!type=edismax v=$q}),1),0,1),100)
fq = {!frange l=20}$ns
Где 20 - ваш 20% -ый порог.
Связано: как мне нормализовать оценку solr/lucene?
Я бы не рекомендовал это делать, потому что абсолютные оценки в Lucene не имеют смысла (например, оценки не сопоставляются напрямую поиск). Соотношение балла и наивысшего результата но абсолютная калибровка для наивысшего балла вернулись, по крайней мере, в настоящее время, поэтому нет способа определить из результаты оценки качества результата. Есть различные подходы к улучшению этого, которые обсуждались ( более сопоставимые оценки, кодируя дополнительную информацию в счет и использование этого для нормализации или, вероятно, лучше, обобщение оценки на объект, содержащий несколько частей Информация; например общее количество условий запроса, соответствующих верхнему результат, если вы используете значение по умолчанию ИЛИ, было бы весьма полезно). Ни один из эти идеи реализованы, насколько я знаю. - @Chuck
Источник: RE: Предельные хиты с порогом оценки
Связанный: Re: Вопрос о функции подсчета очков в Lucene
Ответ 3
Просто обновление для всех, кто спотыкается здесь - EarlyTerminatingSortCollector был предоставлен Lucene, и пользовательский сборщик не нужно делать для это больше. Оберните его над TopDocsCollector (в конкретном случае OP, TopScoreDocCollector) для достижения заданной задачи.
EarlyTerminatingSortCollector
A Collector, который рано завершает сбор документов на основе каждого сегмента, если сегмент был отсортирован в соответствии с данным Sort.
TopDocsCollector
Базовый класс для всех коллекционеров, которые возвращают вывод TopDocs. Этот сборщик позволяет легко расширять, предоставляя один конструктор, который принимает PriorityQueue, а также защищенные члены для этой очереди приоритетов и счетчик числа итогов.