Google Cloud Search 索引队列

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

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

队列是分配给已编入索引的商品的标签(例如,“default”)。

状态和优先级

文档的优先级取决于其 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.pushtype 设置为 NOT_MODIFIEDREPOSITORY_ERRORREQUEUE 搭配使用会取消预留相应条目。

采用哈希值的 Items.push

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

Items.poll

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