Удалить результаты ниже определенного порогового значения в Solr/Lucene?

Есть ли встроенные функции в solr/lucene для фильтрации результатов, если они опускаются ниже определенного порогового значения? Допустим, если я укажу порог оценки 0,2., То все документы с оценкой менее 0,2 будут удалены из моих результатов. Моя интуиция заключается в том, что это возможно путем обновления / настройки Solr или Lucene.

Не могли бы вы указать мне правильное направление, как это сделать?

Заранее спасибо!

3 ответа

Решение

Вы можете написать свой собственный коллектор, который будет игнорировать сбор тех документов, которые оценщик размещает ниже вашего порога. Ниже приведен простой пример этого с использованием Lucene.Net 2.9.1.2 и C#. Вам нужно будет изменить пример, если вы хотите сохранить рассчитанный счет.

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;
    }
}

Это называется нормализованным счетом ( Счеты в процентах).

Для этого вы можете использовать следующие параметры:

ns = {!func}product(scale(product(query({!type=edismax v=$q}),1),0,1),100)
fq = {!frange l=20}$ns

Где 20 - ваш 20% порог.

Связанный: как я могу нормализовать счет solr/lucene?


Я бы не рекомендовал делать это, потому что абсолютные значения баллов в Lucene не имеют смысла (например, баллы не сопоставимы напрямую по результатам поиска). Отношение балла к наивысшему полученному баллу является значимым, но нет абсолютной калибровки для наивысшего балла, по крайней мере, в настоящее время, поэтому нет способа определить, по какому качеству результирующего набора является общее качество., Были обсуждены различные подходы к улучшению этого положения (обеспечение более прямой сопоставимости оценок путем кодирования дополнительной информации в оценку и использования ее для нормализации или, возможно, лучше, обобщение оценки для объекта, который содержит несколько фрагментов информации; например, общее количество условий запроса, соответствующих верхнему результату, если вы используете ИЛИ по умолчанию, было бы весьма полезно). Насколько я знаю, ни одна из этих идей еще не реализована. - @ Чак

Источник: RE: Ограничение попаданий с пороговым значением

Связанный: Re: Вопрос о функции оценки в Lucene

Просто обновление для тех, кто спотыкается здесь - Lucene предоставил EarlyTerminatingSortCollector, и для этого больше не нужно создавать пользовательский коллектор. Оберните его поверх TopDocsCollector (в конкретном случае OP, TopScoreDocCollector), чтобы выполнить поставленную задачу.

EarlyTerminatingSortCollector

Сборщик, который досрочно прекращает сбор документов для каждого сегмента, если сегмент был отсортирован в соответствии с заданной сортировкой.

TopDocsCollector

Базовый класс для всех сборщиков, которые возвращают вывод TopDocs. Этот сборщик позволяет легко расширяться, предоставляя единый конструктор, который принимает PriorityQueue, а также защищенных членов для этой очереди приоритетов и счетчик количества всех попаданий.

Другие вопросы по тегам