2010-01-28 49 views
5

我有具有以下SearchIndex一個草垛搜索:Django的草堆精確過濾

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

不幸的是,這也產生來自程序「健康\其他」和「健康\心血管」的對象。如何停止搜索以允許其他程序進入?

我用Xapian運行Ubuntu 9.10作爲我的搜索後端。

回答

1

您可以使用字段查找here

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

根據文檔和實際情況,過濾器(程序=「健康」)和過濾器(程序_exact =「健康」)是相同的。 – blackrobot 2010-01-29 06:44:31

3

你已經很可能已經解決了這個問題,但我只是偶然發現了與Whoosh後端相同的問題。也許Xapian和Whoosh後端的行爲是一樣的?似乎Whoosh默認情況下會阻止所有CharFields,並在其中搜索某些含有查詢的內容。切換到自定義後端,CharFields上不啓用干擾,爲我解決了這個問題。

希望這會推動別人走向正確的方向。

0

使用「prepare_data」的節目現場,擺脫健康\布拉布拉事情

0

對於Solr的後端我需要使用_exact(只是一個下劃線而不是兩個)。

0

聲明:我是Xapian-Haystack的維護者。

我相信會發生這種情況,因爲Xapian-Haystack使用的是一個字詞發生器,它正在逃避像/這樣的特殊字符。

因此,在您的情況下,"Health\Other"被索引爲"health""other"。這最近在Xapian-Haystack的主分支中被固定,參見例如here