Connector SDK 和 Cloud Search API 支持创建 Cloud Search 索引队列。您可以使用这些队列来:
- 维护每个文档的状态(状态、哈希值等),以确保索引保持同步。
- 维护在遍历过程中发现的一系列项以将其编入索引。
- 根据商品的状态确定其优先级。
- 维护检查点和更改令牌等状态信息。
队列是分配给已编入索引的商品的标签(例如,“default”)。
状态和优先级
文档的优先级取决于其 ItemStatus 代码。可能的代码(按优先级从高到低)如下:
ERROR:相应商品遇到了异步错误,需要重新编入索引。MODIFIED:相应商品之前已编入索引,但在存储区中发生了更改。NEW_ITEM:相应商品尚未编入索引。ACCEPTED:相应内容之前已编入索引,且未发生变化。
对于状态相同的项,在队列中停留时间最长的项具有更高的优先级。
将新项或已更改的项编入索引
图 1 显示了使用索引队列为新项或已更改的项编制索引的步骤。这些步骤反映了 REST API 调用;如需了解等效的 SDK,请参阅队列操作 (Connector SDK)。
- 内容连接器使用
items.push将元数据和哈希推送到队列中。- 如果连接器包含推送
type或contentHash,则 Cloud Search 会确定状态。 - 未知商品会获得
NEW_ITEM状态。 - 具有匹配哈希值的现有内容保持
ACCEPTED。 - 具有不同哈希值的现有商品会变为
MODIFIED。
- 如果连接器包含推送
- 连接器使用
items.poll来确定要编入索引的项。Cloud Search 会按优先级顺序返回项目。 - 连接器从存储区检索项目并构建索引 API 请求。
- 连接器使用
items.index将商品编入索引。商品在成功处理后会进入ACCEPTED状态。
删除内容
完全遍历策略使用两个队列来为项编入索引并检测删除操作。图 2 显示了此策略中的第二次遍历。
- 在初始遍历时,连接器会将项以
NEW_ITEM的形式推送到“队列 A”中。每个商品都获得标签“A”。 - 连接器轮询队列 A 并将相应项编入索引。
- 在第二次完全遍历时,连接器会将商品推送到“队列 B”。
- 未知商品的标签为“B”,状态为
NEW_ITEM。 - 具有匹配哈希值的现有商品会将其标签更改为“B”,并保持
ACCEPTED。 - 具有不同哈希值的现有商品会将其标签更改为“B”,并变为
MODIFIED。
- 未知商品的标签为“B”,状态为
- 连接器轮询队列 B 并将相应项编入索引。
- 最后,连接器在队列 A 上调用
deleteQueueItems。此命令会删除所有之前已编入索引且仍具有标签“A”的项。 - 后续遍历会交换这两个队列的角色。
队列操作 (Connector SDK)
使用 pushItems 构建器推送商品。SDK 会自动使用 Repository 类的 getDoc 方法按优先级顺序从队列中拉取项。
队列操作 (REST API)
- 如需推送,请使用
Items.push。 - 如需轮询,请使用
Items.poll。
您还可以使用 Items.index 在索引编制期间推送项。这些商品会自动获得 ACCEPTED 状态。
Items.push
此方法用于将 ID 添加到队列中。type 决定结果。推送新 ID 会添加一个状态为 NEW_ITEM 的条目。轮询期间返回的可选载荷。
轮询的项会被预留,并且无法通过其他轮询调用返回。将 Items.push 与 type 设置为 NOT_MODIFIED、REPOSITORY_ERROR 或 REQUEUE 搭配使用会取消预留相应条目。
采用哈希值的 Items.push
在推送请求中指定元数据或内容哈希值。
Cloud Search 会将这些值与存储的值进行比较。如果它们不匹配,则相应条目会变为 MODIFIED。不匹配且不存在的 ID 会变为 NEW_ITEM。
Items.poll
此方法用于检索高优先级条目。每个返回的条目都会被预留,直到超时、重新编入索引或使用 Items.push 取消预留。