我希望将我的Cloud内容与ElasticSearch中的索引同步。我希望ES索引始终与Datastore的内容保持一致。
我注意到,在中,通过在Datastore中实现_post_put_hook方法,可以获得一个等价的机制。然而,使用在flex环境中可用的google-cloud-datastore库似乎是不可能的。
在每次插入后是否有接收回调的方法?还是我必须在数据存储API前面设置一个“代理”API,它将在每次插入/删除之后更新我的ES索引?
发布于 2018-02-09 13:52:35
只有当您通过NDB将实体写入数据存储时,_post_put_hook() of NDB.Model才能工作,而且是的,不幸的是,NDB库仅在中可用。我不知道中有这样的特性。如果我没记错的话,Firebase实时数据库或Firestore都有写触发器,但我想您也不急于迁移数据库。
在Datastore中,您需要使用上述方法的“代理”API,或者您需要修改Datastore客户端,以便在任何成功的写op中完成此操作。后者在ElasticSearch中可能带来更高的失败和陈旧数据风险,特别是当客户端超出您的控制范围时。
我相信,如果一致和最新的搜索记录对您的用例很重要,那么定制API是有意义的。Datastore和Python / NDB (可能使用云端点)将是一种很好的方法。
我有一个类似的解决方案运行在上(尽管使用的是内置搜索API而不是ElasticSearch)。如果您选择这条路线,您应该注意两个潜在的注意事项:
_post_put_hook()。我在下面添加了一个代码示例。您可以在文档中找到更多详细信息:模型钩、钩法、成功()_post_put_hook()中的导出特性即可。但是,如果用户提出了请求,这可能是一个问题。对于这些情况,可以通过使用deferred.defer()方法或创建一个push任务,将导出操作推迟到另一个线程。或多或少,它们是一样的。下面,我使用defer()。延迟导出示例:
class CustomModel(ndb.Model):
def _post_put_hook(self, future):
try:
if future.check_success() is None:
deferred.defer(export_to_search, self.key)
except:
pass # or log error to Cloud Console with logging.error('blah')
def export_to_search(key=None):
try:
if key is not None:
entity = key.get()
if entity is not None:
call_export_api(entity)
except:
pass # or log error to Cloud Console with logging.error('blah')https://stackoverflow.com/questions/48704105
复制相似问题