1

我正在使用 Google App Engine 的搜索 API来索引数据存储区中的实体。创建或修改对象后,我必须将其添加到搜索索引中。我通过add_to_search_index为其实体被索引的每个模型创建一个方法来做到这一点,例如:

class Location(ndb.Model):
  ...
  def add_to_search_index(self):
    fields = [
       search.TextField(name="name", value=self.name),
       search.GeoField(name="location", value= search.GeoPoint(self.location.lat, self.location.lon)),
             ]
    document = search.Document(doc_id=str(self.key.id()), fields=fields)
    index = search.Index(name='Location_index')
    index.put(document)

搜索 API 是否会自动维护索引文档和数据存储实体之间的任何对应关系?

我怀疑它们不是,这意味着搜索 API 将在其索引中保留已删除、过时的实体。如果是这种情况,那么我想最好的方法是使用NDB 钩子方法来创建一个remove_from_search_index之前调用的方法put(用于编辑/更新)和delete. 请告知是否有更好的解决方案来维护数据存储和搜索索引之间的对应关系。

4

1 回答 1

2

由于数据存储 (NDB) 和搜索 API 是独立的后端,因此它们将单独维护。我看到您使用的key.id()是文档 ID。您可以使用此文档 ID 获取文档或将其删除。维护搜索文档的创建可以在模型_post_put_hook_post_delete_hook. 您也可以使用存储库模式来执行此操作。你如何做到这一点取决于你。

index = search.Index(name='Location_index')
index.delete([doc_id])
于 2013-10-25T21:05:27.790 回答