Django Haystack精确过滤

时间:2010-01-28 17:35:55

标签: python django xapian django-haystack

我有一个haystack搜索,它有以下SearchIndex:

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')

不幸的是,这也产生了来自'Health \ Other'和'Health \ Cardiovascular'程序的对象。如何阻止搜索允许其他程序进入?

我用Xapian作为我的搜索后端运行Ubuntu 9.10。

5 个答案:

答案 0 :(得分:3)

你已经可以解决这个问题,但我只是偶然发现了飞快移动后端的问题。也许Xapian和Whoosh后端的行为相同?似乎Whoosh默认阻止所有CharFields,并使用某种contains-query在其中搜索。切换到自定义后端,但没有在CharFields上启用词干,为我解决了这个问题。

希望这会推动其他人走向正确的方向。

答案 1 :(得分:1)

您可以使用here所述的字段查找。

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

答案 2 :(得分:0)

对程序字段使用“prepare_data”并摆​​脱health \ blabla事物

答案 3 :(得分:0)

对于solr后端,我需要使用_exact(只有一个下划线而不是两个)。

答案 4 :(得分:0)

免责声明:我是Xapian-Haystack的维护者。

我相信这是因为Xapian-Haystack正在使用一个术语生成器来逃避像/这样的特殊字符。

因此,在您的情况下,"Health\Other"被编入索引为"health""other"。最近修复了Xapian-Haystack的主分支,例如here