定期更新的数据和Search API

时间:2012-08-16 02:26:25

标签: google-app-engine python-2.7 google-cloud-datastore gae-search

我有一个需要非常灵活的搜索功能的应用程序。作为其中的一部分,用户将需要能够对许多文本字段进行全文搜索,但也需要过滤许多数字字段,这些字段记录定期更新的数据(有时超过一次或两次)一分钟)。此数据存储在NDB数据存储中。

我目前正在使用Search API创建文档对象和索引来搜索文本数据,我知道我还可以为这些文档添加数值以进行索引。但是,由于这些数字字段的动态特性,我将不断更新(删除和重新创建)搜索API索引的文档。即使我允许搜索API在一段时间内使用旧数据,它仍然需要每天更新几次。对我而言,这似乎不是存储此数据进行搜索的有效方式,特别是考虑到搜索查询的数量将远远少于数据更新的数量。

我是否有办法处理这种动态数据,这比不断修改搜索文档更有效?

我对这个想法的唯一想法是实现一个两步过程,然后将全文搜索的结果用于针对NDB数据存储区的查询中,或者使用Python手动过滤。似乎都不理想,但我没有想法。提前感谢您的任何帮助。

1 个答案:

答案 0 :(得分:2)

搜索API的文档确实可以包含数字数据,并且可以轻松更新,但正如您所说,如果您正在进行大量更新,那么频繁修改文档可能并非最佳

您可能考虑的一种设计会将数值数据存储在数据存储区实体中,但也会大量使用缓存 - 内存缓存或后端内存缓存。交叉引用文档及其关联实体(即,将实体设计为包含具有关联文档ID的字段,以及包含具有关联实体键的字段的文档)。如果您的应用程序域是doc id和数据存储区实体键名称可以是相同的字符串,那么这更简单。

然后,在缓存中,按doc id索引数字字段信息。这样您就可以有效地获取查询检索到的文档的关联数字信息。您当然需要管理数据存储区实体更新的缓存。

只要缓存的大小不需要太大,就可以正常工作。

如果您的doc id和关联的实体键名称可以是相同的字符串,那么我认为您可以利用ndb的缓存支持来完成大部分工作。