Поиск диапазона значений int с использованием djapian

Я использую djapian в качестве поискового бэкэнда и ищу диапазон значений. Например:

query = 'comments:(0..10)'
Post.indexer.search(query)

будет искать сообщения с 0 до 10 комментариев. Я не могу найти способ сделать это в djapian, хотя я нашел эту проблему и патч для реализации какого-либо поиска по диапазону дат. Я также нашел эту страницу в официальных документах xapian, описывающих какой-то запрос диапазона. Однако мне не хватает знаний для того, чтобы сформулировать свой собственный необработанный запрос xapian и / или передать необработанный запрос xapian в djapian. Так что помогите мне ТАК, как я могу запросить индекс Джапиана для диапазона значений int.

Спасибо,

Laurie

1 ответ

Решение

Хорошо, я решил это. Я оставлю здесь ответ для потомков.

Первое, что нужно сделать, это прикрепить NumberValueRangeProcessor к QueryParser, Вы можете сделать это, расширив djapian Indexer._get_query_parser, Обратите внимание на подчеркивание. Ниже приведен фрагмент кода, показывающий, как я это сделал.

from djapian import Indexer
from xapian import NumberValueRangeProcessor

class RangeIndexer(Indexer)
    def _get_query_parser(self, *args, **kwargs):
        query_parser = Indexer._get_query_parser(self, *args, **kwargs)
        valno = self.free_values_start_number + 0
        nvrp = NumberValueRangeProcessor(valno, 'value_range:', True)
        query_parser.add_valuerangeprocessor(nvrp)
        return query_parser

Строки, чтобы отметить:

valno = self.free_values_start_number + 0

self.free_values_start_number является intи используется как значение no, это индекс первого столбца, в котором начинаются поля. я добавил 0 к этому, чтобы указать, что вы должны добавить индекс поля, для которого вы хотите искать диапазон.

nvrp = NumberValueRangeProcessor(valno, 'value_range:', True)

Мы отправляем valno сказать процессору, с каким полем иметь дело. 'value_range:' указывает префикс для процессора, поэтому мы можем искать, сказав 'value_range:(0..100)'. True просто указывает, что 'value_range:' должен рассматриваться как префикс, а не как суффикс.

query_parser.add_valuerangeprocessor(nvrp)

Это просто добавляет NumberValueRangeProcessor к QueryParser,

Надеюсь, что это поможет всем, кто имеет какие-либо проблемы с этим вопросом. Обратите внимание, что вам нужно будет добавить новый NumberValueRangeProcessor для каждого поля вы хотите иметь возможность поиска по диапазону.

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