Массовая загрузка документов "search api" в appengine?
Мы хотели бы за один раз загрузить около 30 тыс. Сущностей в хранилище данных, одновременно создавая документы из строк, связанных с этими сущностями.
Это делается для частичного поиска строк, для которых хранилище данных не подходит.
Однако нам не удалось найти какие-либо ресурсы или документацию по массовой загрузке документов с использованием функции API поиска.
Как мы пойдем об этом?
Мы попытались использовать Bulkloader, который продолжает выдавать следующую ошибку
google.appengine.ext.db.KindError: No implementation for kind 'Prototype'
Это было связано с тем, что мы пытались загрузить модели ndb, но из-за ошибки можно предположить, что по умолчанию используется db
Мы попытались обойти это, определить класс как модель db и загрузить его. Это работает, и данные загружаются в хранилище данных, однако post_put_hook не работает
Вот код:
#models.py
import datetime
from google.appengine.ext import db
from google.appengine.tools import bulkloader
class PrototypeE(db.Model):
#creating db Model of data
p_id=db.StringProperty(indexed=True,required=True)
p_name=db.StringProperty(required=True)
p_val=db.IntegerProperty(required=True)
p_lnk=db.StringProperty(required=True)
p_src=db.StringProperty(choices=site_list)
p_create_time=db.DateTimeProperty(auto_now_add=True)
p_update_time=db.DateTimeProperty(auto_now=True)
p_gen=db.StringProperty(choices=gen_list)
p_img=db.StringProperty()
p_cat=db.StringProperty()
p_brd=db.StringProperty()
p_keys=db.StringProperty()
def _post_put_hook(self,Future):
doc_key=Future.get_result()
doc_id=doc_key.id()
doc= search.Document(doc_id=unicode(doc_id),
fields=[
search.TextField(name="keywords",value=self.p_keys),
search.NumberField(name="value",value=self.p_price)
]) #document
logging.info(doc)
try:
index=search.Index(name="Store_Doc")
index.put(doc) #putting data into document
except search.Error:
logging.exception('Doc put failed')
И загрузчик:
#proto_loader.py
import datetime
from google.appengine.ext import ndb
from google.appengine.tools import bulkloader
import models
class ProtoLoader(bulkloader.Loader):
def __init__(self):
bulkloader.Loader.__init__(self, 'PrototypeE',
[('p_id', str),
('p_name', str),
('p_val', int),
('p_lnk', str),
('p_src',str),
('p_gen',str),
('p_img',str),
('p_cat',str),
('p_brd',str),
('p_keys',str)
])
loaders = [ProtoLoader]
Это успешно загружает данные в хранилище данных, но ловушка не вызывается и документы не создаются.
Нужно ли нам редактировать файл массового загрузчика, чтобы обойти эту проблему?
ОБНОВЛЕНИЕ: Как упоминалось ранее, мы попытались смешать ndb и db в том, что мы получаем следующую ошибку при определении класса как ndb.Model на всем протяжении
Traceback (most recent call last):
File "appcfg.py", line 126, in <module>
run_file(__file__, globals())
File "appcfg.py", line 122, in run_file
execfile(_PATHS.script_file(script_name), globals_)
File "/home/stw/Google/google_appengine/google/appengine/tools/appcfg.py", line 5220, in <module>
main(sys.argv)
File "/home/stw/Google/google_appengine/google/appengine/tools/appcfg.py", line 5211, in main
result = AppCfgApp(argv).Run()
File "/home/stw/Google/google_appengine/google/appengine/tools/appcfg.py", line 2886, in Run
self.action(self)
File "/home/stw/Google/google_appengine/google/appengine/tools/appcfg.py", line 4890, in __call__
return method()
File "/home/stw/Google/google_appengine/google/appengine/tools/appcfg.py", line 4693, in PerformUpload
run_fn(args)
File "/home/stw/Google/google_appengine/google/appengine/tools/appcfg.py", line 4574, in RunBulkloader
sys.exit(bulkloader.Run(arg_dict))
File "/home/stw/Google/google_appengine/google/appengine/tools/bulkloader.py", line 4408, in Run
return _PerformBulkload(arg_dict)
File "/home/stw/Google/google_appengine/google/appengine/tools/bulkloader.py", line 4219, in _PerformBulkload
LoadConfig(config_file)
File "/home/stw/Google/google_appengine/google/appengine/tools/bulkloader.py", line 3886, in LoadConfig
Loader.RegisterLoader(cls())
File "proto_loader.py", line 40, in __init__
('p_keys',str)
File "/home/stw/Google/google_appengine/google/appengine/tools/bulkloader.py", line 2687, in __init__
GetImplementationClass(kind)
File "/home/stw/Google/google_appengine/google/appengine/tools/bulkloader.py", line 957, in GetImplementationClass
implementation_class = db.class_for_kind(kind_or_class_key)
File "/home/stw/Google/google_appengine/google/appengine/ext/db/__init__.py", line 296, in class_for_kind
raise KindError('No implementation for kind \'%s\'' % kind)
google.appengine.ext.db.KindError: No implementation for kind 'PrototypeE'
Как указывает на ошибку, bulkloader принимает класс db и проверяет с помощью db.class_for_kind, что приводит к ошибке при использовании ndb