我使用Djapian按关键字搜索对象,但我希望能够过滤结果。最好使用Django的QuerySet API,例如:
if query.strip():
results = Model.indexer.search(query).prefetch()
else:
results = Model.objects.all()
results = results.filter(somefield__lt=somevalue)
return results
但是Djapian返回ResultSet
个Hit
个对象,而不是Model
个对象。我当然可以在Python中“手动”过滤对象,但是在过滤所有对象时(当查询为空时)它是不现实的 - 我将不得不从数据库中检索整个表。
我是否因为使用Djapian而不幸?
答案 0 :(得分:4)
我经历了它的源代码,发现Djapian有一个可以应用于结果的过滤方法。我刚刚尝试了以下代码,它似乎正在工作。
我的索引器如下:
class MarketIndexer( djapian.Indexer ):
fields = [ 'name', 'description', 'tags_string', 'state']
tags = [('state', 'state'),]
以下是我如何过滤结果(更不用说为通配符使用的第一行):
objects = model.indexer.search(q_wc).flags(djapian.resultset.xapian.QueryParser.FLAG_WILDCARD).prefetch()
objects = objects.filter(state=1)
执行时,它会使Market
的状态等于“1”。
答案 1 :(得分:0)
我不认识Djapian,但我熟悉xapian。在Xapian中,您可以使用MatchDecider过滤结果。
在匹配搜索条件的每个文档上调用匹配决策程序的决策函数,因此在这里对每个文档执行数据库查询不是一个好主意,但您当然可以访问文档的值。
例如,在ubuntuusers.de,我们有一个xapian数据库,其中包含博客帖子,论坛帖子,行星条目,wiki条目等,xapian数据库中的每个文档都有一些存储为值的附加访问信息。在查询之后,AuthMatchDecider过滤潜在文档并返回过滤后的MSet,然后将其显示给用户。
如果决策程序与某些领域一样简单< somevalue,你也可以简单地将somefield的值添加到文档的值(使用xapian提供的sortable_serialize
函数)并添加(使用OP_FILTER
)OP_VALUE_RANGE
查询到原始值查询。