使用djapian搜索int值的范围

时间:2010-10-23 23:02:20

标签: python django search xapian

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

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

会搜索0到10条评论的帖子。虽然我找到this issuepatch来实现某种日期范围搜索,但我找不到在djapian中执行此操作的方法。我还从xapian官方文档中找到this page来描述某种范围查询。但是,我缺乏制定我自己的原始xapian查询和/或将原始xapian查询提供给djapian的知识。那么请帮助我,我如何查询一系列int值的djapian索引。

谢谢,

劳里

1 个答案:

答案 0 :(得分: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,用作值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