我正在使用django-haystack来为我的应用程序搜索,并且我有布尔型字段,我想过滤我的模型。但是,当我尝试这样做时,我的搜索查询失败。如何在django-haystack搜索查询中使用布尔型字段
我使用的搜索后端是elasticsearch
我正在使用django-haystack来为我的应用程序搜索,并且我有布尔型字段,我想过滤我的模型。但是,当我尝试这样做时,我的搜索查询失败。如何在django-haystack搜索查询中使用布尔型字段
我使用的搜索后端是elasticsearch
发布你的一些代码在这里的是搞清楚到底是怎么回事错了你,因为这是很难用什么来解决有帮助。
我是如何实现这一点(使用嗖而不是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'
在搜索索引
希望这有助于让你在正确的轨道上,如果你还没有想通了。
sqs = sqs.filter(boolean_field=True)
没有对我也(使用草堆2.1.0和1.2.1 Elasticsearch),但
sqs = sqs.filter(boolean_field=1)
没有工作。
哇,谢谢你关于Whoosh的一点:我在本地使用它,因为我很懒,我一直在这里坚持一段时间(尽管我还没有摆脱这种行为,即使使用'default = “false'')。 – Tom 2013-03-27 17:53:06
我与Elasticsearch有同样的问题,并为我修复了它。同样重要的是要注意,你不能使用实际的布尔值进行过滤......这是一种愚蠢的行为。你必须使用'true'或'false'。例如sqs = sqs.filter(mybool ='true')。使用True或False将表现得像'真',如果不是彻头彻尾的错误,那真的感觉像是一个可怕的设计。 – Cerin 2013-05-23 03:33:47