我正在使用djapian作为我的搜索后端,我正在寻找一系列值。例如:
query = 'comments:(0..10)'
Post.indexer.search(query)
会搜索0到10条评论的帖子。虽然我找到this issue和patch来实现某种日期范围搜索,但我找不到在djapian中执行此操作的方法。我还从xapian官方文档中找到this page来描述某种范围查询。但是,我缺乏制定我自己的原始xapian查询和/或将原始xapian查询提供给djapian的知识。那么请帮助我,我如何查询一系列int值的djapian索引。
谢谢,
劳里
答案 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_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
。