3

ページをクロールし、appengine search api(スペイン語とカタロニア語のページ、アクセント付きの文字)を使用してインデックスを作成しています。検索を実行して結果のページを作成することができます。

snipetted_fieldsでクエリオブジェクトを使用しようとすると、常にUnicodeEncodeErrorが生成されるため、問題が発生します。

  File "/home/otger/python/jobs-gae/src/apps/search/handlers/results.py", line 82, in find_documents
    return index.search(query_obj)
  File "/opt/google_appengine_1.7.6/google/appengine/api/search/search.py", line 2707, in search
    apiproxy_stub_map.MakeSyncCall('search', 'Search', request, response)
  File "/opt/google_appengine_1.7.6/google/appengine/api/apiproxy_stub_map.py", line 94, in MakeSyncCall
    return stubmap.MakeSyncCall(service, call, request, response)
  File "/opt/google_appengine_1.7.6/google/appengine/api/apiproxy_stub_map.py", line 320, in MakeSyncCall
    rpc.CheckSuccess()
  File "/opt/google_appengine_1.7.6/google/appengine/api/apiproxy_rpc.py", line 156, in _WaitImpl
    self.request, self.response)
  File "/opt/google_appengine_1.7.6/google/appengine/ext/remote_api/remote_api_stub.py", line 200, in MakeSyncCall
    self._MakeRealSyncCall(service, call, request, response)
  File "/opt/google_appengine_1.7.6/google/appengine/ext/remote_api/remote_api_stub.py", line 234, in _MakeRealSyncCall
    raise pickle.loads(response_pb.exception())
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf3' in position 52: ordinal not in range(128)

私はstackoverflowで同様の質問を見つけました:GAE全文検索開発コンソールUnicodeEncodeErrorですが、それは1.7.0で修正されたバグであると言っています。バージョン1.7.5と1.7.6のどちらを使用しても同じエラーが発生します。

ページのインデックスを作成するときに、descriptionとdescription_asciiの2つのフィールドを追加します。description_asciiのスニペットを生成しようとすると、完全に機能します。

これは、dev_appserverでASCII以外のコンテンツのスニペットを生成することは可能ですか?

4

1 に答える 1

2

これはバグだと思います。新しい欠陥の問題が報告されていますhttps://code.google.com/p/googleappengine/issues/detail?id=9335

開発サーバーの一時的な解決策-google.appengine.api.searchモジュール(search.py​​)を見つけ、次のようにインラインを追加して関数_DecodeUTF8にパッチを適用します。

def _DecodeUTF8(pb_value):
  """Decodes a UTF-8 encoded string into unicode."""
  if pb_value is not None:
    return pb_value.decode('utf-8') if not isinstance(pb_value, unicode) else pb_value
  return None

回避策-問題が解決するまで、スニペット機能を自分で実装します-スニペットのベースとなるフィールドが呼び出されると仮定しますsnippet_base

query = search.Query(query_string=query_string,
                 options=
                    search.QueryOptions(
                        ...
                        returned_fields= [... 'snippet_base' ...]
                        ))
results = search.Index(name="<index-name>").search(query)
if results:
    for res in results.results:
        res.snippet = some_snippeting_function(res.field("snippet_base"))
于 2013-05-17T13:51:20.567 に答える