2010-10-23 60 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