Google Cloud Search 索引队列

借助 Connector SDK 和 Google Cloud Search API,您可以创建 Cloud Search 索引队列用于执行以下任务:

  • 维护每个文档的多方面状况(状态、哈希值等),以便用于确保索引与存储区保持同步。

  • 维护在遍历过程中发现的一系列项以将其编入索引。

  • 根据项的状态确定该项在队列中的优先级。

  • 维护其他状态信息(如检查点、更改标记等),以确保高效集成。

队列是为编入索引的项分配的标签,如“default”的 默认队列或“B”。

状态和优先级

文档在队列中的优先级取决于其 ItemStatus 代码。以下是 ItemStatus 代码,按优先级顺序(从先处理到最后处理):

  • ERROR - 将项编入索引期间发生了异步错误,并且需要重新编入索引。

  • MODIFIED - 已编入索引的项自上次编入索引后在存储区中发生了修改。

  • NEW_ITEM - 未编入索引的项。

  • ACCEPTED - 之前已编入索引且在 存储库。

如果队列中的两个项具有相同状态,则在队列中停留时间最长的项将被赋予更高优先级。

简要介绍如何使用索引编制队列将新项或已更改的项编入索引

图 1 显示了使用索引编制功能将新项或更改后的项编入索引的步骤 队列。以下步骤显示了 REST API 调用。如需了解等效的 SDK 调用,请参阅 队列操作(连接器 SDK)

Google Cloud Search 索引编制概览
图 1. 添加或更新内容的索引编制步骤
  1. 内容连接器使用 items.push 将项(元数据和哈希)推送到索引队列中,以建立项的 状态(MODIFIEDNEW_ITEMDELETED)。具体而言:

    • “推送”时,连接器明确包含“Push” typecontentHash
    • 如果连接器不包含 type,则使用 Cloud Search 自动使用 contentHash 来确定项目的状态。
    • 如果商品未知,则商品状态会设置为 NEW_ITEM
    • 如果内容存在且哈希值匹配,则状态会保持为 ACCEPTED
    • 如果内容存在,并且哈希值不同,则状态会变为 MODIFIED

    如需详细了解如何确定商品状态,请参阅 遍历 GitHub 代码库 请参阅 Cloud Search 使用入门教程

    推送通常与内容遍历和/或更改检测相关 多个进程。

  2. 内容连接器使用 items.poll 来轮询队列以确定要编入索引的项。Cloud Search 会告知连接器 哪些项最需要编入索引,首先按状态代码排序,然后排序 按在队列中的时间排序

  3. 连接器从存储库中检索这些项并构建索引 API 请求。

  4. 该连接器使用 items.index 以将各项内容编入索引。只有在使用 Cloud Search 之后,该项才会进入 ACCEPTED 状态 已成功完成处理该商品。

如果仓库中已不存在某个项,连接器也可以将其删除, 或者,如果某项内容未修改或存在 源代码库错误。有关内容删除的信息,请参见 部分。

简要介绍如何使用索引编制队列删除项

通过 全面遍历策略 使用双队列进程来索引项 和检测删除事件。图 2 显示了使用 2 删除项的步骤 编入索引队列。具体而言,图 2 显示了执行的第二次遍历 来训练机器学习模型。这些步骤使用 REST API 调用。对于 请参阅队列操作(连接器 SDK)

Google Cloud Search 索引编制概览
图 2. 删除内容
  1. 在初始遍历中,内容连接器使用 items.push 将项(元数据和哈希)推送到索引队列中,即“队列 A”为 NEW_ITEM,因为它在队列中不存在。系统会为每项内容分配标签 “A”。内容会编入索引到 Cloud Search 中。

  2. 内容连接器使用 items.poll 轮询队列 A 以确定要编入索引的项。Cloud Search 会告知连接器 哪些项最需要编入索引,首先按状态代码排序,然后排序 按在队列中的时间排序

  3. 连接器从存储库中检索这些项并构建索引 API 请求。

  4. 该连接器使用 items.index 以将各项内容编入索引。只有在使用 Cloud Search 之后,该项才会进入 ACCEPTED 状态 已成功完成处理该商品。

  5. 通过 deleteQueueItems 方法在“队列 B”上调用。但是,没有项目推送到队列 B, 所有内容均无法删除。

  6. 在第二次完全遍历时,内容连接器使用 items.push 将项(元数据和哈希)推送到队列 B:

    • “推送”时,连接器明确包含“Push” typecontentHash
    • 如果连接器不包含 type,则使用 Cloud Search 自动使用 contentHash 来确定项目的状态。
    • 如果项未知,则项状态会设置为 NEW_ITEM,且队列 标签已更改为“B”
    • 如果内容存在并且哈希值匹配,则状态会保持为 ACCEPTED 且队列标签更改为“B”。
    • 如果内容存在并且哈希值不同,则状态会变为 MODIFIED 且队列 标签已更改为“B”
  7. 内容连接器使用 items.poll 来轮询队列以确定要编入索引的项。Cloud Search 会告知连接器 哪些项最需要编入索引,首先按状态代码排序,然后排序 按在队列中的时间排序

  8. 连接器从存储库中检索这些项并构建索引 API 请求。

  9. 该连接器使用 items.index 以将各项内容编入索引。只有在使用 Cloud Search 之后,该项才会进入 ACCEPTED 状态 已成功完成处理该商品。

  10. 最后, deleteQueueItems 在队列 A 上调用,以删除所有先前已编入索引的 CCloud Search 项, 还有队列“A”标签。

  11. 随后完全遍历时,该队列会被用于 和用于删除的队列进行交换。

队列操作 (Connector SDK)

借助 Content Connector SDK,您可以将项推送到队列中,以及从队列中拉取项。

如需打包某个项并将其推送到队列中,请使用 pushItems Builder 类。

要从队列中拉取项以进行处理,您无需执行任何特定操作。SDK 会自动按照优先级从队列中拉取项 使用 Repository 类的 getDoc 方法。

队列操作 (REST API)

通过 REST API,您可以分别使用以下两个方法将项推送到队列中以及从队列中拉取项:

  • 如需将项推送到队列中,请使用 Items.push
  • 如需轮询队列中的项,请使用 Items.poll

您还可以使用 Items.index 在索引编制期间将项推送到队列中。推送到队列的项( ) 索引编制不需要 type 并会自动将其状态指定为 ACCEPTED

Items.push

通过 Items.push 方法可将 ID 添加到队列中。可以使用特定的 type 值,用于确定推送操作的结果。如需查看 type 值的列表,请参阅 添加到 Items.push 中的 item.type 字段 方法。

推送新 ID 会添加一个包含 NEW_ITEM 的新条目 ItemStatus 代码。

可选载荷始终会作为不透明值进行存储,并返回 来自 Items.poll

轮询某个项时,系统会预留该项,这意味着它无法由 另一个调用 Items.poll。 使用 Items.push 替换为 type 作为 NOT_MODIFIEDREPOSITORY_ERRORREQUEUE取消预订 轮询条目。如需进一步了解预留条目和未预留条目, 请参阅 Items.poll 部分。

Items.push(采用哈希值)

Google Cloud Search API 支持指定元数据和内容哈希值 已开启 Items.index 请求。您不必指定 type, 元数据和/或内容哈希值 可以通过推送请求指定Cloud Search Indexing Queue 会将 将提供的哈希值与 数据源。如果不匹配,则该条目将被标记为 MODIFIED。如果相应的 项索引中不存在,则状态为 NEW_ITEM

Items.poll

Items.poll 方法用于从队列中检索具有最高优先级的条目。请求的 返回的状态值表示 请求的优先级队列或所返回 ID 的状态。

默认情况下,系统可以根据优先级返回任意队列部分中的条目。每个返回条目均保留,其他 不会返回该条目 调用 Items.poll 直到出现以下任一情况:

  • 预留超时。
  • Items.index 将该条目再次加入队列。
  • Items.push 通过 type NOT_MODIFIEDREPOSITORY_ERRORREQUEUE 的值。