2012-08-16 58 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) 

没有工作。