我正在使用Google App Engine的Search 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是否自动维护索引文档和数据存储区实体之间的任何对应关系?
我怀疑它们不是,这意味着Search API将在其索引中维护已删除的,过时的实体。如果是这种情况,那么我认为最好的方法是使用NDB hook methods创建remove_from_search_index
之前调用的put
方法(用于编辑/更新)和delete
}。请告知是否有更好的解决方案来维护数据存储区和搜索索引之间的对应关系。
答案 0 :(得分:2)
由于数据存储区(NDB)和搜索API是单独的后端,因此它们将单独维护。我看到你使用key.id()
作为文档ID。您可以使用此文档ID来获取文档或将其删除。维护搜索文档的创建可以在模型的_post_put_hook
和_post_delete_hook
中完成。您也可以使用存储库模式来执行此操作。你是怎么做到的,取决于你。
index = search.Index(name='Location_index')
index.delete([doc_id])