2012-08-16 46 views

回答

5

發佈你的一些代碼在這裏的是搞清楚到底是怎麼回事錯了你,因爲這是很難用什麼來解決有幫助。

我是如何實現這一點(使用嗖而不是elasticsearch,但Django的代碼應該是一樣的/無論如何相似)就像這樣:

創建了自己的searchform類(如果你還沒有這樣做這一點,看看Haystack Docs - Creating your own form

from django import forms 
from haystack.forms import SearchForm 

class PaidPropertySearchForm(SearchForm): 
    q = forms.CharField(required=False, label=('Town Area')) 
    #othersearchtermshere 
    furnished = forms.BooleanField(required=False) 

    def search(self): 
     sqs = super(PaidPropertySearchForm, self).search() 
     #other search filtering here 
     if self.is_valid() and self.cleaned_data['furnished']: 
      sqs = sqs.filter(furnished__contains=self.cleaned_data['furnished']) 

     return sqs 

相關模型場很簡單:

class Properties (models.Model):. 
    furnished = models.BooleanField() 

和我searchindexes.py:

class PropertyIndex(indexes.SearchIndex, indexes.Indexable): 
    #other indexed terms 
    furnished = indexes.BooleanField(model_attr='furnished', default='false') 

這是值得注意的,有乾草堆,並與布爾值嗖的一聲後端之間的一些問題,,需要我指定defult指標值作爲一個字符串「假」,而不是布爾值false。如果我沒有這樣做,或者沒有設置默認值,由於某些原因,所有的布爾值被索引爲True,而不管模型存儲了什麼。我不知道這個問題會影響elasticsearch,所以你可能不需要

default='false' 
在搜索索引

希望這有助於讓你在正確的軌道上,如果你還沒有想通了。

+0

哇,謝謝你關於Whoosh的一點:我在本地使用它,因爲我很懶,我一直在這裏堅持一段時間(儘管我還沒有擺脫這種行爲,即使使用'default = 「false'')。 – Tom 2013-03-27 17:53:06

+1

我與Elasticsearch有同樣的問題,併爲我修復了它。同樣重要的是要注意,你不能使用實際的布爾值進行過濾......這是一種愚蠢的行爲。你必須使用'true'或'false'。例如sqs = sqs.filter(mybool ='true')。使用True或False將表現得像'真',如果不是徹頭徹尾的錯誤,那真的感覺像是一個可怕的設計。 – Cerin 2013-05-23 03:33:47

3
sqs = sqs.filter(boolean_field=True) 

沒有對我也(使用草堆2.1.0和1.2.1 Elasticsearch),但

sqs = sqs.filter(boolean_field=1) 

沒有工作。