python appengine unicodeencodeerror в фрагментах результатов поиска API

Я просматриваю страницы и индексирую их с помощью 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. Если я попытаюсь сгенерировать фрагменты для description_ascii, он отлично сработает.

Возможно ли генерировать фрагменты содержимого, отличного от ascii, на dev_appserver?


person Otger    schedule 19.03.2013    source источник


Ответы (1)


Я думаю, что это ошибка, сообщается о новой проблеме дефекта 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"))
person Robert Lujo    schedule 17.05.2013