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