Поиск диапазона значений int с использованием djapian - PullRequest
1 голос
/ 24 октября 2010

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

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

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

Спасибо

Laurie

1 Ответ

0 голосов
/ 28 октября 2010

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

Первое, что нужно сделать, это прикрепить 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 для каждого поля, которое вы хотите иметь возможность поиска по диапазону.

...