0

Django + Haystack + Elasticsearch を使用しています。

このビューにリクエストを送信すると

from haystack.views import FacetedSearchView

from .models import Object


class ObjectView(FacetedSearchView):

    def extra_context(self):
        extra = super(ObjectView, self).extra_context()

        if not self.results:
            extra['objects'] = Object.objects.all()
        else:
            searchqueryset = self.form.search()
            results = [ result.pk for result in searchqueryset ]
            extra['facets'] = self.results.facet_counts()
            extra['objects'] = Object.objects.filter(pk__in=results)
            extra['results'] = self.results
        return extra

このエラーが発生します:

  File "/home/deploy/.virtualenvs/deploy/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 115, in get_response
    response = callback(request, *callback_args, **callback_kwargs)

  File "/home/deploy/.virtualenvs/deploy/local/lib/python2.7/site-packages/haystack/views.py", line 49, in __call__
    return self.create_response()

  File "/home/deploy/.virtualenvs/deploy/local/lib/python2.7/site-packages/haystack/views.py", line 129, in create_response
    (paginator, page) = self.build_page()

  File "/home/deploy/.virtualenvs/deploy/local/lib/python2.7/site-packages/haystack/views.py", line 106, in build_page
    self.results[start_offset:start_offset + self.results_per_page]

  File "/home/deploy/.virtualenvs/deploy/local/lib/python2.7/site-packages/haystack/query.py", line 266, in __getitem__
    self._fill_cache(start, bound)

  File "/home/deploy/.virtualenvs/deploy/local/lib/python2.7/site-packages/haystack/query.py", line 164, in _fill_cache
    results = self.query.get_results(**kwargs)

  File "/home/deploy/.virtualenvs/deploy/local/lib/python2.7/site-packages/haystack/backends/__init__.py", line 485, in get_results
    self.run(**kwargs)

  File "/home/deploy/.virtualenvs/deploy/local/lib/python2.7/site-packages/haystack/backends/elasticsearch_backend.py", line 942, in run
    results = self.backend.search(final_query, **search_kwargs)

  File "/home/deploy/.virtualenvs/deploy/local/lib/python2.7/site-packages/haystack/backends/__init__.py", line 26, in wrapper
    return func(obj, query_string, *args, **kwargs)

  File "/home/deploy/.virtualenvs/deploy/local/lib/python2.7/site-packages/haystack/backends/elasticsearch_backend.py", line 521, in search
    distance_point=kwargs.get('distance_point'), geo_sort=geo_sort)

  File "/home/deploy/.virtualenvs/deploy/local/lib/python2.7/site-packages/haystack/backends/elasticsearch_backend.py", line 571, in _process_results
    raw_suggest = raw_results['suggest']['suggest']

KeyError: 'suggest'

奇妙な事実: プロジェクトが運用環境にある場合にのみ、settings_production モジュール (URL キーを除く) で Haystack または Elasticsearch に関連するものを 1 つも変更していない場合でも、問題が発生します。

プロジェクト/settings_production.py

'URL': 'http://0.0.0.0:9200/'

本番環境では、単純な FastCGI しか使用していません。

そして、これが本当に私を悩ませていることです:時々、このビューでエラーが発生せず、すべてがうまく機能します...

どうか、誰かが何が起こっているのか考えを持っていますか?

どうもありがとう!

アップデート:

SO、私はプロジェクト全体を別のコンピューターにセットアップしました。いくつかのテストの後、私は確認しました:

  1. この問題は、上で説明したように私のプロダクション設定とは関係ありません。

  2. Elasticsearch サービスが停止している場合、エラーは発生しません。

  3. サービスが実行されている場合:

    • メソッドObject.objects.all()が QuerySet の結果を返すとき、エラーは発生しませんでした。
    • メソッドObject.objects.all()空のQuerySet を返す場合、問題は解決しません。

これは、Haystack の elasticsearch_backend モジュールの何らかのバグだと思います。

それでも、よくわかりません。

4

1 に答える 1