Django Haystack 精确过滤

5 投票
5 回答
2629 浏览
提问于 2025-04-15 18:36

我有一个搜索功能,使用了以下的搜索索引:

class GrantIndex(indexes.SearchIndex):
    """
    This provides the search index for the Grant application.
    """
    text = indexes.CharField(document=True, use_template=True)
    year = indexes.IntegerField(model_attr='year__year')
    date = indexes.DateField(model_attr='date')
    program = indexes.CharField(model_attr='program__area')
    grantee = indexes.CharField(model_attr='grantee')
    amount = indexes.IntegerField(model_attr='amount')
site.register(Grant, GrantIndex)

如果我想搜索并排除所有不是“健康”的程序,我会运行以下查询:

from haystack.query import SearchQuerySet

sqs = SearchQuerySet()
sqs = sqs.filter(program='Health')

可惜的是,这样做还是会得到来自“健康\其他”和“健康\心血管”的结果。我该怎么做才能不让这些其他程序出现在搜索结果中呢?

我在使用Ubuntu 9.10,并且用Xapian作为我的搜索后台。

5 个回答

0

使用“prepare_data”来处理程序字段,把健康和其他杂七杂八的东西去掉。

1

你可以使用字段查找,具体的说明可以在这里找到。

sqs = sqs.filter(program__exact='Health')
3

你可能已经解决了这个问题,但我刚好遇到了同样的问题,跟Whoosh这个后端有关。也许Xapian和Whoosh的表现是一样的?看起来Whoosh默认会对所有的CharFields(字符字段)进行词干提取,也就是把单词变成它的基本形式,然后用某种包含查询的方式在里面搜索。切换到一个自定义的后端,并且在CharFields上不启用词干提取,解决了我的这个问题。

希望这能给其他人指明正确的方向。

撰写回答