【问题标题】:Regularly updated data and the Search API定期更新数据和搜索 API
【发布时间】:2012-08-16 02:26:25
【问题描述】:

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

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

有没有一种比不断修改搜索文档更有效的方法来处理这些动态数据?

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    只要缓存的大小不需要太大,这可能会很好。

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

    【讨论】:

    • 我遇到的主要困境是使用这些数值进一步过滤结果。因此,如果我需要根据数值进一步缩小结果范围,我应该只使用这个缓存的数据,遍历结果集中的每组值,以及来自缓存的相关数值数据,并且只使用标准的 python 逻辑比较以消除不符合标准的结果?
    • 抱歉,我错过了您也想过滤数字字段。在这种情况下,它本质上归结为进行应用级连接。 (或者,维护搜索文档中的所有信息)。但是,如果可能,您希望利用数据存储的查询引擎。因此,一种方法是根据您的数字过滤器对实体进行仅键查询,然后根据文本查询返回的文档检查该键列表,丢弃任何不与实体键相交的文档列表。然后,对于通过该过滤器的文档,从缓存中获取相关的数字数据。
    • 我上面评论的附录——如果您的实体查询返回一个可管理的小结果集,这种方法是可行的。如果不是,并且如果文档结果集比实体查询结果小得多,那么(如您所建议的)将文档 ID 约束推送到数据存储查询可能会更好。
    • 感谢您的帮助,我对 App Engine 环境还比较陌生,您的建议对于解决这个问题非常宝贵。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多