2

私はdjango-haystackを使用してアプリケーションの検索を強化しており、モデルをフィルタリングしたいブールフィールドがあります。ただし、これを実行しようとすると、検索クエリが失敗します。

私が使用している検索バックエンドはelasticsearchです

4

2 に答える 2

5

ここにコードの一部を投稿すると、問題の原因を特定するのに役立ちます。何もないとトラブルシューティングを行うのは難しいためです。

これをどのように実装したか(elasticsearchではなくwhooshを使用しましたが、djangoコードはとにかく同じ/類似している必要があります)は次のようでした:

独自の検索フォーム クラスを作成しました (まだこれを行っていない場合は、Haystack Docs - 独自のフォームの作成を参照してください)

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'

検索インデックスに

まだ理解していない場合は、これが正しい軌道に乗るのに役立つことを願っています.

于 2012-10-06T21:59:19.530 に答える
4
sqs = sqs.filter(boolean_field=True) 

私にとってもうまくいきませんでした(Haystack 2.1.0とElasticsearch 1.2.1を使用)が、

sqs = sqs.filter(boolean_field=1)

やりました。

于 2014-07-11T15:53:18.330 に答える