2010-10-23 63 views
1

我使用djapian作为我的搜索后端,并且我正在寻找一系列值。例如:使用djapian搜索int值的范围

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

将搜索0到10个评论之间的帖子。我找不到在djapian中这样做的方法,尽管我找到this issuepatch来实现某种日期范围搜索。我还从xapian官方文档中找到了描述某种范围查询的this page。但是,我缺乏知识来制定我自己的原始xapian查询,和/或将原始xapian查询提供给djapian。所以帮助我,我怎样才能查询一个djapian索引的一系列int值。

感谢,

劳瑞

回答

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_numberint,并且没有用作值,它是其中的字段开始被定义的第一个列的索引。我为此添加了0,以表明您应该添加想要进行范围搜索的字段的索引。

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

我们发送valno告诉处理器需要处理哪些字段。 'value_range:'表示处理器的前缀,因此我们可以通过说'value_range:(0..100)'进行搜索。 True只是表示'value_range:'应被视为前缀而不是后缀。

query_parser.add_valuerangeprocessor(nvrp) 

这只是增加了NumberValueRangeProcessorQueryParser

希望帮助人谁拥有这方面的任何问题。请注意,您需要为每个您希望能够进行范围搜索的字段添加新的NumberValueRangeProcessor