CKE 文档访问历史记录

为了帮助提供商了解其 Cortex Knowledge Extensions (CKE) 中有哪些文档正被访问,Snowflake 提供了以下功能:

先决条件

由于 主键 为每个文档定义了唯一标识符,因此您必须为 Cortex Search Service 指定一个主键,以获取访问历史记录。

备注

修改现有 Cortex Search Service 的主键列会使之前的 CKE 访问历史记录失效。

若要解读之前的 CKE 访问历史记录,请保存从旧主键列到新主键列的映射。

了解文档 IDs

文档 IDs 由 Cortex Search Service 主键 组成。为了保护客户数据,Snowflake 在跟踪访问历史记录时会对主键列进行编码和哈希处理。您可以使用以下函数将主键映射到提供的已哈希处理的文档 ID:

LISTING_ACCESS_HISTORY 视图中的 CKE 访问历史记录示例

此示例执行以下操作:

第 1 步:创建一个每日访问摘要表,仅检索 CKE 访问信息。

CREATE TABLE IF NOT EXISTS cke_document_daily_access AS
SELECT query_date,
       consumer_account_name,
       consumer_name,
       hashed_doc_id,
       hash_version,
       total_access_count
  FROM (
    SELECT query_date,
           consumer_account_name,
           consumer_name,
           flattened.value::string AS hashed_doc_id,
           lah.share_objects_accessed[0]:"hashVersion"::string AS hash_version,
      COUNT(*) AS total_access_count
      FROM snowflake.data_sharing_usage.listing_access_history AS lah,
        LATERAL FLATTEN(
          input => lah.share_objects_accessed[0]:"hashedDocumentIds"
        ) AS flattened
      WHERE lah.share_objects_accessed[0]:"objectDomain" = 'Cortex Search Service'
        AND lah.share_objects_accessed[0]:"hashVersion" IS NOT NULL
      GROUP BY query_date,
               consumer_account_name,
               consumer_name,
               hashed_doc_id,
               hash_version
);

第 2 步:创建一个表来存储编码后的主键。

CREATE TABLE IF NOT EXISTS encoded_primary_keys AS
  (
    SELECT pkCol1,
           pkCol2,
           SYSTEM$ENCODE_CKE_PRIMARY_KEY(pkCol1, pkCol2) AS encoded_primary_key
      FROM your_cortex_search_table
  )

第 3 步:从上一步创建的表中,准备哈希版本并为您的主键计算哈希处理后的 IDs。然后将 cke_document_daily_access 表与哈希处理后的主键视图连接,以恢复原始主键列。

WITH hash_versions AS
  (
    SELECT DISTINCT hash_version AS hash_version
      FROM cke_document_daily_access
  ),
  hashed_primary_key AS
  (
    SELECT pkCol1,
           pkCol2,
           hash_version,
           SYSTEM$CKE_HASH_FUNCTION(hash_version, encoded_primary_key) AS hashed_doc_id
      FROM encoded_primary_keys
      CROSS JOIN hash_versions
  )
SELECT pk.pkCol1,
       pk.pkCol2,
       a.query_date,
       a.consumer_account_name,
       a.consumer_name,
       a.total_access_count
  FROM cke_document_daily_access AS a
  JOIN hashed_primary_key AS pk
    ON a.hashed_doc_id = pk.hashed_doc_id
    AND a.hash_version = pk.hash_version;