1

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

我对此使用 Djapian 不走运吗?

4

2 回答 2

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”的 s。

于 2009-09-28T01:21:39.457 回答
0

我不知道 Djapian,但我熟悉 xapian。在 Xapian 中,您可以使用MatchDecider过滤结果。

匹配决策器的决策函数会在与搜索条件匹配的每个文档上调用,因此在这里对每个文档进行数据库查询并不是一个好主意,但您当然可以访问文档的值。

例如,在ubuntuusers.de我们有一个 xapian 数据库,其中包含博客帖子、论坛帖子、行星条目、wiki 条目等,xapian 数据库中的每个文档都有一些额外的访问信息作为值存储。查询后,AuthMatchDecider 过滤潜在文档并返回过滤后的 MSet,然后将其显示给用户。

如果决策过程像 somefield < somevalue 一样简单,您也可以简单地将 somefield 的值添加到文档的值中(使用sortable_serializexapian 提供的函数),然后在原始查询中添加(使用OP_FILTEROP_VALUE_RANGE查询。

于 2009-09-27T17:26:02.770 回答