Массовая загрузка документов "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

0 ответов

Другие вопросы по тегам