2013-09-14 2 views
3

Я использовал версию 1.8.1 API App Engine из-за известной проблемы с удаленным API в более поздней версии. Попытка последней 1.8.4, я встретив ошибку с кодом, который работал хорошо в 1.8.1, но теперь терпит неудачу, пытаясь добавить документ в поисковый индекс:App Engine 1.8.4 повышает AttributeError, помещая документ в индекс поиска

Traceback (most recent call last): 
    File "~/tools/devappserver2/api_server.py", 
62, in _handle_POST 
    api_response = _execute_request(request).Encode() 
    File "~/tools/devappserver2/api_server.py", line 1 
23, in _execute_request 
    make_request() 
    File "~/tools/devappserver2/api_server.py", line 1 
15, in make_request 
    request_id) 
    File "~/google/appengine/api/apiproxy_stub.py", line 130, in MakeSy 
ncCall 
    method(request, response) 
    File "~/google/appengine/api/search/simple_search_stub.py", line 65 
4, in _Dynamic_IndexDocument 
    index.IndexDocuments(params.document_list(), response) 
    File "~/google/appengine/api/search/simple_search_stub.py", line 40 
4, in IndexDocuments 
    self._inverted_index.AddDocument(doc_id, document) 
    File "~/google/appengine/api/search/simple_search_stub.py", line 30 
3, in AddDocument 
    self._AddFieldType(field.name(), field.value().type()) 
    File "~/google/appengine/api/search/simple_search_stub.py", line 28 
9, in _AddFieldType 
    self._schema.AddFieldType(name, field_type) 
AttributeError: 'dict' object has no attribute 'AddFieldType' 

ERROR 2013-09-14 22:31:45,132 webapp2.py:1552] AttributeError("'dict' object has no attribute 'Ad 
dFieldType'",) 
Traceback (most recent call last): 
    File "~/lib/webapp2-2.5.2/webapp2.py", line 1535, in __call__ 
    rv = self.handle_exception(request, response, e) 
    File "~/lib/webapp2-2.5.2/webapp2.py", line 1529, in __call__ 
    rv = self.router.dispatch(request, response) 
    File "~/lib/webapp2-2.5.2/webapp2.py", line 1278, in default_dispat 
cher 
    return route.handler_adapter(request, response) 
    File "~/lib/webapp2-2.5.2/webapp2.py", line 1102, in __call__ 
    return handler.dispatch() 
    File "~/lib/webapp2-2.5.2/webapp2.py", line 572, in dispatch 
    return self.handle_exception(e, self.app.debug) 
    File "~/lib/webapp2-2.5.2/webapp2.py", line 570, in dispatch 
    return method(*args, **kwargs) 
    File "~/docroot/update.py", line 49, in get 
    booking.add_to_search_index() 
    File "~/docroot/booking.py", line 94, in add_to_search_index 
    index.put(booking_full_text_document) 
    File "~/google/appengine/api/search/search.py", line 2506, in put 
    response) 
    File "~/google/appengine/api/apiproxy_stub_map.py", line 94, in Mak 
eSyncCall 
    return stubmap.MakeSyncCall(service, call, request, response) 
    File "~/google/appengine/api/apiproxy_stub_map.py", line 328, in Ma 
keSyncCall 
    rpc.CheckSuccess() 
    File "~/google/appengine/api/apiproxy_rpc.py", line 156, in _WaitIm 
pl 
    self.request, self.response) 
    File "~/google/appengine/ext/remote_api/remote_api_stub.py", line 2 
00, in MakeSyncCall 
    self._MakeRealSyncCall(service, call, request, response) 
    File "~/google/appengine/ext/remote_api/remote_api_stub.py", line 2 
34, in _MakeRealSyncCall 
    raise pickle.loads(response_pb.exception()) 
RuntimeError: AttributeError("'dict' object has no attribute 'AddFieldType'",) 
INFO  2013-09-14 22:31:45,145 module.py:593] default: "GET /update/somekey/someparamter/value HTTP/1.1" 500 2 
691 

Раздел кода ответственного:

from google.appengine.ext import ndb 
from google.appengine.api import search 
import logging 

class Booking(ndb.Model): 

    timestamp = ndb.DateTimeProperty(auto_now_add=True) 
    last_modified = ndb.DateTimeProperty(auto_now=True) 

    field1 = ndb.StringProperty() 
    field2 = ndb.StringProperty() 
    #etc... 

    def add_to_search_index(self): 

     list_of_full_text_fields = [ 
      'field1', 
      'field2', 
     ] 

     full_text_data = [] 

     for field in list_of_full_text_fields: 

      full_text_data.append(unicode(getattr(self, field))) 

     full_text_data = ' '.join(full_text_data) 

     full_text_document = search.Document(

     doc_id = self.key.urlsafe(), 
     fields=[ 
      search.TextField(
       name='f', 
       value=full_text_data 
      ), 
      ] 
     ) 

     try: 
      index = search.Index(name="fullText") 
      index.put(full_text_document) 
     except search.Error: 
      logging.exception('Put failed') 

ответ

2

Могут ли быть изменения API в этих версиях?

Версия 1.8.3 - 6 августа 2013 г. Опубликован крупный пересмотренный документ API поиска. Пожалуйста, смотрите: https://developers.google.com/appengine/docs/python/search/

или багфикс ..

Version 1.8.4 - 9 сентября 2013 Исправлена ​​проблема юникода, связанные с выражениями в Search API. Поиск с отсканированными полями не выполнялся в документах, содержащих символы юникода.

http://code.google.com/p/googleappengine/wiki/SdkReleaseNotes