1

私はdjango-haystack 2.1.0とwhoosh 2.5.2バックエンドでDjango 1.5.1を使用しています:

models.py:

GENDER_CHOICES = (
    (u'M', u'Male'),
    (u'F', u'Female'),
)

class Applicant(models.Model):

    gender = models.CharField(max_length=1, choices=GENDER_CHOICES)
    first_name = models.CharField(max_length=64)
    last_name = models.CharField(max_length=64)

search_indexes.py:

class ApplicantIndex(indexes.SearchIndex, indexes.Indexable):

    text = indexes.CharField(document=True,use_template=True)
    gender = indexes.CharField(model_attr="gender")

検索テンプレート

{{ object.first_name }}
{{ object.last_name }}

djangoシェルで私は次のことを試みています:

>>> from haystack.query import SearchQuerySet

>>> sqs=SearchQuerySet()
>>> sqs
[<SearchResult: tooldb.applicant (pk=u'1')>, <SearchResult: tooldb.applicant (pk=u'2')>]

>>> sqs[0].gender
u'M'     #<-- So this seems to be indexed

#but when i try:
>>> sqs.filter(gender='M')
[]     #<-- I get nothing ... ?

他の CharFields を選択せず​​に max_lenght > 1 で試してみましたが、まったく問題ありません。干し草のスタック フィルターが必要です。

私は何が欠けていますか?

4

2 に答える 2

2

さて、私はそれを得たと思います..

haystack と whoosh を組み合わせても、単一文字のクエリはまったく機能しないようです。
これは、Django の QuerySet が機能する方法で SearchQuerySet を実装する必要があるという厄介な原因です。( https://django-haystack.readthedocs.org/en/v2.1.0/searchqueryset_api.html#why-follow-queryset )

QuerySet のフィルター メソッドは、クエリとして 1 文字で正常に機能します。SearchQuerySet は何も返しません。

これはどこかに文書化する必要があります...

于 2013-09-10T15:26:19.363 に答える
2

これが私の解決策です:

class ApplicantIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    gender = indexes.CharField()

    def prepare_gender(self, obj):
        return obj.gender*3

次のようにフィルタリングできます。

sqs.filter(gender='MMM')
于 2013-12-24T12:09:05.873 に答える