Djapian - 过滤结果

时间:2009-09-27 16:27:35

标签: python django search full-text-search xapian

我使用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返回ResultSetHit个对象,而不是Model个对象。我当然可以在Python中“手动”过滤对象,但是在过滤所有对象时(当查询为空时)它是不现实的 - 我将不得不从数据库中检索整个表。

我是否因为使用Djapian而不幸?

2 个答案:

答案 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_FILTEROP_VALUE_RANGE查询到原始值查询。