Google Cloud Search 索引队列

借助 Connector SDK 和 Cloud Search API,您可以创建 Cloud Search 索引队列。您可以使用这些队列来:

  • 维护每个文档的多方面状况(状态、哈希值等),以便确保索引保持同步。
  • 维护在遍历过程中发现的一系列项以将其编入索引。
  • 根据项的状态确定其优先级。
  • 维护状态信息(如检查点和更改令牌)。

队列是分配给已编入索引的项的标签(例如“默认”)。

状态和优先级

文档的优先级取决于其 ItemStatus 代码。可能的代码(按优先级从高到低排列)如下:

  • ERROR:项遇到了异步错误,需要重新编入索引。
  • MODIFIED:项之前已编入索引,但在存储库中发生了更改。
  • NEW_ITEM:项尚未编入索引。
  • ACCEPTED:项之前已编入索引,并且未发生更改。

对于状态相同的项,在队列中停留时间最长的项具有更高的优先级。

将新项或已更改的项编入索引

图 1 显示了使用索引队列将新项或已更改的项编入索引的步骤。这些步骤反映了 REST API 调用;如需了解 SDK 等效项,请参阅 队列操作 (Connector SDK)

Cloud Search 索引编制概览
图 1.添加或更新项的索引步骤
  1. 内容连接器使用 items.push 将元数据和哈希值推送到队列中。
    • 如果连接器包含推送 typecontentHash,Cloud Search 会确定状态。
    • 未知项会收到 NEW_ITEM 状态。
    • 哈希值匹配的现有项会保持 ACCEPTED 状态。
    • 哈希值不同的现有项会变为 MODIFIED 状态。
  2. 连接器使用 items.poll 确定要编入索引的项。Cloud Search 会按优先级顺序返回项。
  3. 连接器从存储库中检索项,并构建索引 API 请求。
  4. 连接器使用 items.index 将项编入索引。项在成功处理后会进入 ACCEPTED 状态。

删除项

完全遍历策略使用两个队列将项编入索引并检测删除操作。图 2 显示了此策略中的第二次遍历。

Cloud Search 索引编制概览
图 2.删除项
  1. 在初始遍历时,连接器会将项作为 NEW_ITEM 推送到“队列 A”中。每个项都会收到标签“A”。
  2. 连接器会轮询队列 A 并将项编入索引。
  3. 在第二次完全遍历时,连接器会将项推送到“队列 B”中。
    • 未知项会收到标签“B”和 NEW_ITEM 状态。
    • 哈希值匹配的现有项会将其标签更改为“B”并保持 ACCEPTED 状态。
    • 哈希值不同的现有项会将其标签更改为“B”并变为 MODIFIED 状态。
  4. 连接器会轮询队列 B 并将项编入索引。
  5. 最后,连接器会对队列 A 调用 deleteQueueItems 。这会删除所有之前已编入索引且仍具有标签“A”的项。
  6. 后续遍历会交换这两个队列的角色。

队列操作 (Connector SDK)

使用 pushItems 构建器推送项。SDK 会自动使用 Repository 类的 getDoc 方法按 优先级顺序从队列中拉取项。

队列操作 (REST API)

您还可以在编入索引期间使用 Items.index 推送项。这些项会自动收到 ACCEPTED 状态。

Items.push

此方法会将 ID 添加到队列中。 type 决定了结果。推送新 ID 会添加一个具有 NEW_ITEM 状态的条目。 可选的载荷会在轮询期间返回。

轮询的项是 预留的,无法通过其他轮询调用返回。使用 Items.push 并将 type 设置为 NOT_MODIFIEDREPOSITORY_ERRORREQUEUE取消预留 条目。

采用哈希值的 Items.push

在推送请求中指定元数据或内容哈希值。 Cloud Search 会将这些值与存储的值进行比较。如果它们不匹配,条目会变为 MODIFIED。不匹配且不存在的 ID 会变为 NEW_ITEM

Items.poll

此方法会检索高优先级的条目。每个返回的条目都会被预留,直到超时、重新编入索引或使用 Items.push 取消预留为止。