【问题标题】:how do i use a boolean field in django-haystack search query我如何在 django-haystack 搜索查询中使用布尔字段
【发布时间】:2012-08-16 21:01:06
【问题描述】:

我正在使用 django-haystack 来搜索我的应用程序,并且我有一些布尔字段,我想通过它来过滤我的模型。但是,当我尝试这样做时,我的搜索查询失败了。

我使用的搜索后端是 elasticsearch

【问题讨论】:

    标签: django elasticsearch django-haystack


    【解决方案1】:

    在此处发布您的一些代码将有助于您找出问题所在,因为很难在没有任何问题的情况下进行故障排除。

    我是如何实现这个的(使用 whoosh 而不是 elasticsearch,但 django 代码无论如何应该是相同/相似的)是这样的:

    创建了我自己的搜索表单类(如果您还没有这样做,请查看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')
    

    这里值得注意的是,haystack 和带有布尔值的 whoosh 后端之间存在一些问题,这需要我将默认索引值指定为字符串“false”而不是布尔值 False。如果我没有这样做或没有设置默认值,由于某种原因,所有布尔值都被索引为 True,无论模型存储了什么。不知道这个问题会不会影响elasticsearch,所以你可能不需要

    default='false'
    

    在您的搜索索引中

    如果您还没有弄清楚,希望这可以帮助您走上正确的道路。

    【讨论】:

    • 哇,感谢有关 Whoosh 的介绍:我在本地使用它是因为我很懒,而且我在这里已经发疯了一段时间(尽管我还没有摆脱这种行为甚至使用default='false')。
    • 我在使用 Elasticsearch 时遇到了同样的问题,这为我解决了这个问题。同样重要的是要注意,您不能使用实际的布尔值进行过滤……这有点愚蠢。您必须使用“真”或“假”。例如sqs = sqs.filter(mybool='true')。使用 True 或 False 会表现得像 'true',如果不是彻头彻尾的错误,这真的感觉就像一个可怕的设计。
    【解决方案2】:
    sqs = sqs.filter(boolean_field=True) 
    

    对我也不起作用(使用 Haystack 2.1.0 和 Elasticsearch 1.2.1)但是

    sqs = sqs.filter(boolean_field=1)
    

    做到了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-13
      • 1970-01-01
      • 2020-06-01
      • 2014-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多