CKEドキュメントのアクセス履歴

プロバイダーが:doc:`Cortex Knowledge Extensions(CKE)</user-guide/snowflake-cortex/cortex-knowledge-extensions/cke-overview>`内のどのドキュメントがアクセスされているかを把握できるように、Snowflakeは次の機能を提供します。

  • label-share-objects-accessed-array`内の:doc:/sql-reference/data-sharing-usage/listing-access-history`にあるCKEアクセス履歴データ。

  • :doc:`/sql-reference/functions/system_encode_cke_primary_key`システム関数。

  • :doc:`/sql-reference/functions/system_cke_hash_function`システム関数。

前提条件

:ref:`主キー<label-cortex_search_primary_keys>`は各ドキュメントの一意の識別子を定義するため、アクセス履歴を取得するには、:doc:`Cortex Search Service </user-guide/snowflake-cortex/cortex-search/cortex-search-overview>`に主キーを指定する必要があります。

注釈

既存のCortex Search Serviceの主キー列を変更すると、以前のCKEアクセス履歴が無効になります。

以前のCKEアクセス履歴を解釈するには、古い主キー列から新しい主キー列へのマッピングを保存します。

ドキュメントIDsの理解

ドキュメントIDsは、Cortex Search Serviceの:ref:`主キー<label-cortex_search_primary_keys>`で構成されます。顧客データを保護するため、Snowflakeはアクセス履歴を追跡する際に主キー列をエンコードしてハッシュ化します。次の関数を使用して、主キーを提供されたハッシュ化ドキュメントIDにマッピングできます。

LISTING_ACCESS_HISTORYビューでのCKEアクセス履歴の例

この例では、次のアクションを実行します。

  • :doc:`/sql-reference/data-sharing-usage/listing-access-history`ビューからCKEアクセス情報のみを取得し、他のすべてのイベントを除外する

  • :doc:`/sql-reference/functions/system_encode_cke_primary_key`関数を使用して、CKEドキュメントの主キー列のエンコードされた表現を構築する

  • ハッシュバージョンを取得し、:doc:`/sql-reference/functions/system_cke_hash_function`を使用してすべての主キーに対してハッシュ化されたドキュメントIDを計算する

  • 計算されたハッシュ化されたIDsおよびバージョンをビューに結合して、元の主キー列を復元する

ステップ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を計算します。次に、:code:`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;