0

人々の名前を保存して検索可能にする必要があるアプリケーションがあります。私が使用しているテクノロジーは、python (v2.7.6) django (v1.9.5) レスト フレームワークです。dbms は postgresql (v9.2) です。ユーザー名はアラビア語にすることができるため、db エンコーディングとして utf-8 を使用しています。検索には、インデックス作成用の Amazon Elastic Search で haystack (v2.4.1) を使用しています。インデックスは数日前に正常に構築されていましたが、今では再構築しようとすると

python manage.py rebuild_index

次のエラーで失敗します

'ascii' codec can't decode byte 0xc3 in position 149: ordinal not in range(128)

完全なエラー トレースは次のとおりです。

  File "/usr/local/lib/python2.7/dist-packages/haystack/management/commands/update_index.py", line 188, in handle_label
    self.update_backend(label, using)
  File "/usr/local/lib/python2.7/dist-packages/haystack/management/commands/update_index.py", line 233, in update_backend
    do_update(backend, index, qs, start, end, total, verbosity=self.verbosity, commit=self.commit)
  File "/usr/local/lib/python2.7/dist-packages/haystack/management/commands/update_index.py", line 96, in do_update
    backend.update(index, current_qs, commit=commit)
  File "/usr/local/lib/python2.7/dist-packages/haystack/backends/elasticsearch_backend.py", line 193, in update
    bulk(self.conn, prepped_docs, index=self.index_name, doc_type='modelresult')
  File "/usr/local/lib/python2.7/dist-packages/elasticsearch/helpers/__init__.py", line 188, in bulk
    for ok, item in streaming_bulk(client, actions, **kwargs):
  File "/usr/local/lib/python2.7/dist-packages/elasticsearch/helpers/__init__.py", line 160, in streaming_bulk
    for result in _process_bulk_chunk(client, bulk_actions, raise_on_exception, raise_on_error, **kwargs):
  File "/usr/local/lib/python2.7/dist-packages/elasticsearch/helpers/__init__.py", line 85, in _process_bulk_chunk
    resp = client.bulk('\n'.join(bulk_actions) + '\n', **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/elasticsearch/client/utils.py", line 69, in _wrapped
    return func(*args, params=params, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/elasticsearch/client/__init__.py", line 795, in bulk
    doc_type, '_bulk'), params=params, body=self._bulk_body(body))
  File "/usr/local/lib/python2.7/dist-packages/elasticsearch/transport.py", line 329, in perform_request
    status, headers, data = connection.perform_request(method, url, params, body, ignore=ignore, timeout=timeout)
  File "/usr/local/lib/python2.7/dist-packages/elasticsearch/connection/http_requests.py", line 68, in perform_request
    response = self.session.request(method, url, data=body, timeout=timeout or self.timeout)
  File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 455, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 558, in send
    r = adapter.send(request, **kwargs)
  File "/usr/lib/python2.7/dist-packages/requests/adapters.py", line 330, in send
    timeout=timeout
  File "/usr/local/lib/python2.7/dist-packages/urllib3/connectionpool.py", line 558, in urlopen
    body=body, headers=headers)
  File "/usr/local/lib/python2.7/dist-packages/urllib3/connectionpool.py", line 353, in _make_request
    conn.request(method, url, **httplib_request_kw)
  File "/usr/lib/python2.7/httplib.py", line 979, in request
    self._send_request(method, url, body, headers)
  File "/usr/lib/python2.7/httplib.py", line 1013, in _send_request
    self.endheaders(body)
  File "/usr/lib/python2.7/httplib.py", line 975, in endheaders
    self._send_output(message_body)
  File "/usr/lib/python2.7/httplib.py", line 833, in _send_output
    msg += message_body
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 149: ordinal not in range(128)

私の推測では、以前はデータベースにアラビア文字がなかったのでインデックスは正常に構築されていましたが、ユーザーがアラビア文字を入力したため、インデックスの構築に失敗しました。

4

3 に答える 3

0

Elasticsearch はさまざまなエンコーディングをサポートしているため、アラビア文字が問題になることはありません。

AWS を使用しているため、 requests-aws4authなどの認証ライブラリも使用していると仮定します。その場合は、認証中に のような Unicode ヘッダーが追加されることに注意してu'x-amz-date'ください。これは問題です。python の httplib は _send_output() の実行中に次の処理を実行するからです:msg = "\r\n".join(self._buffer)ここで、_buffer は HTTP ヘッダーのリストです。Unicodeヘッダーを持つmsgことは<type 'unicode'>、実際にはタイプである必要がありますstrここでは、異なる認証ライブラリに関する同様の問題があります)。

例外を発生させる行はmsg += message_body、python がmessage_bodymsg のタイプと一致するようにユニコードにデコードする必要があるため、例外を発生させます。py-elasticsearch が既にencodingを処理しているため、例外が発生します。そのため、unicode へのエンコードが 2 回行われ、例外が発生します (ここで説明されているように)。

認証ライブラリを (たとえばDavidMuller/aws-requests-authに) 置き換えて、問題が解決するかどうかを確認してください。

于 2016-11-25T22:13:56.937 に答える
0

DBに表示されるアラビア文字については、あなたが正しいと思います。

もこの問題に関連している可能性があります。最初のリンクには何らかの回避策があるようですが、詳細はあまりありません。作者が何を言いたいのか疑わしい

適切な修正は、str の代わりに unicode 型を使用するか、デフォルトのエンコーディングを (私が推測するに) utf-8 に適切に設定することです。

LANG=en_US.UTF-8それが実行されているマシンが少なくともUTF-8であることを確認する必要があるということですLANG

于 2016-04-25T17:59:03.893 に答える