2010-10-23 2 views
1

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

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

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

Спасибо,

Laurie

ответ

0

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

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