Cortex Search Serviceにクエリする

Cortex Search Serviceを作成すると、 REST API エンドポイントがサービスにクエリを提供するためにプロビジョニングされます。Cortex Search Serviceへのクエリには2つのオプションがあります。

  • Snowflake Python APIs を使用する

  • 任意のクライアントを使用して、 REST エンドポイントに直接クエリを実行する

Snowflake Python APIs

Cortex Search Servicesは、 Snowflake Python APIs (現在プレビュー中)のバージョン0.8.0以降を使用してクエリできます。 Snowflake Python APIs の詳細については Snowflake Python APIs: PythonによるSnowflakeオブジェクトの管理 をご参照ください。

Snowflake Python APIs ライブラリのインストール

まず、最新版の Snowflake Python APIs パッケージを PyPI からインストールします。PyPI からこのパッケージをインストールする手順については、 Snowflake Python APIs ライブラリのインストール をご参照ください。

pip install snowflake -U
Copy

Snowflakeに接続する

Snowpark Session またはPython Connector Connection のいずれかを使用してSnowflakeに接続し、 Root オブジェクトを作成します。Snowflakeへの接続方法については、 Snowflake Python APIs によるSnowflakeへの接続 をご参照ください。以下の例では、設定にSnowpark Session オブジェクトとPythonディクショナリを使用しています。

import os
from snowflake.core import Root
from snowflake.snowpark import Session

CONNECTION_PARAMETERS = {
    "account": os.environ["snowflake_account_demo"],
    "user": os.environ["snowflake_user_demo"],
    "password": os.environ["snowflake_password_demo"],
    "role": "test_role",
    "database": "test_database",
    "warehouse": "test_warehouse",
    "schema": "test_schema",
}

session = Session.builder.configs(CONNECTION_PARAMETERS).create()
root = Root(session)
Copy

サービスをクエリする

以下の構文でサービスをクエリします。

# fetch service
my_service = (root
  .databases["<service_database>"]
  .schemas["<service_schema>"]
  .cortex_search_services["<service_name>"]
)

# query service
resp = my_service.search(
  query="<query>",
  columns=["<col1>", "<col2>"],
  filter={"@eq": {"<column>": "<value>"} },
  limit=5
)
print(resp.to_json())
Copy

注釈

Cortex Search Serviceにクエリするには、 Snowflake Python APIs ライブラリのバージョン0.8.0以降が必要です。

Rest API

Cortex Searchは、現在プレビュー中の Snowflake REST APIs のスイートで、 REST API エンドポイントを公開しています。Cortex Search Service用に生成される REST エンドポイントの構造は以下の通りです。

https://<account_url>/api/v2/databases/<db_name>/schemas/<schema_name>/cortex-search-services/<service_name>:query
Copy

条件:

  • <account_url>: Snowflakeアカウントの URL。アカウント URL を見つける手順ついては アカウントの組織名とアカウント名の検索 をご参照ください。

  • <db_name>: サービスが存在するデータベース。

  • <schema_name>: サービスが存在するスキーマ。

  • <service_name>: サービス名。

  • :query: サービス上で呼び出すメソッド。この場合、 query メソッド。

詳細については、 Cortex Search Service の REST API リファレンスをご参照ください。以下は、サービスをクエリする際に使用するパラメーターとフィルター構文について説明します。

パラメーター

パラメーター

説明

query

検索クエリ、サービス内のテキスト列を検索します。

columns

カンマ区切りのリストで、応答内の関連する結果ごとに返す列を指定します。これらの列は、サービスのソースクエリに含まれている必要があります。

filter

ATTRIBUTES 列のデータに基づいて結果をフィルタリングするためのフィルターオブジェクト。 フィルター構文 をご参照ください。

limit

応答で返す結果の最大数。
最大許容値は1000です。
デフォルト値は10です。

フィルター構文

Cortex Searchは、 CREATE CORTEX SEARCH SERVICE コマンドで指定された ATTRIBUTES 列でのフィルタリングをサポートします。

Cortex Searchは2つのマッチング演算子をサポートしています。

  • 文字列の等質性: @eq

  • 配列が含まれる: @contains

これらのマッチング演算子は、さまざまな論理演算子と組み合わせることができます。

  • @and

  • @or

  • @not

これらの演算子は1つのフィルターオブジェクトにまとめることができます。以下に例を挙げます。

  • 文字列のような列 string_col が値 value と等しい行に対するフィルタリング。

    { "@eq": { "string_col": "value" } }
    
    Copy
  • ARRAY 列 array_col に値 value が含まれる行のフィルタリング。

    { "@contains": { "array_col": "arr_value" } }
    
    Copy
  • 論理演算子でフィルターを構成する

    // Rows where the "array_col" column contains "arr_value" and the "string_col" column equals "value":
    {
        "@and": [
          { "@contains": { "array_col": "arr_value" } },
          { "@eq": { "string_col": "value" } }
        ]
    }
    
    // Rows where the "string_col" column does not equal "value"
    {
      "@not": { "@eq": { "string_col": "value" } }
    }
    
    // Rows where the "array_col" column contains at least one of "val1", "val2", or "val3"
    {
      "@or": [
          { "@contains": { "array_col": "val1" } },
          { "@contains": { "array_col": "val1" } },
          { "@contains": { "array_col": "val1" } }
      ]
    }
    
    Copy

REST API 認証の構成

Snowflake REST APIs は現在、キーペア認証と OAuth による認証をサポートしています。詳細については、 Snowflakeでの Snowflake REST APIs 認証 をご参照ください。

サービスをクエリする例

curl とキーペア認証を使用してサービスをクエリするには:

curl --location https://<ACCOUNT_URL>/api/v2/databases/<DB_NAME>/schemas/<SCHEMA_NAME>/cortex-search-services/<SERVICE_NAME>\:query \
--header 'X-Snowflake-Authorization-Token-Type: KEYPAIR_JWT' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header "Authorization: Bearer $CORTEX_SEARCH_JWT" \
--data '{
  "query": "<search_query>",
  "columns": ["col1", "col2"],
  "filter": <filter>
  "limit": <limit>
}'
Copy

注釈

JWT 認証を使用して REST API をクエリする場合、ユーザーの既定のロールが使用されます。したがって、サービスをクエリするユーザーの既定のロールは、サービスが存在するデータベースとスキーマ、およびサービス自体の USAGE でなければなりません。クエリを実行するユーザーロールは、ソースクエリのデータに対する権限を必ずしも必要としません。ユーザーロールの詳細については、 ユーザーのロール をご参照ください。

SQL システム関数によるプレビューサービス

SNOWFLAKE.CORTEX.SEARCH_PREVIEW 関数により、ワークシートやSnowflakeノートブックのセルなどの SQL 環境内から、Cortex Search Serviceに対する個々のクエリの結果をプレビューすることができます。この関数により、サービスが正しく入力され、妥当な結果を提供していることを簡単に検証できます。

次の例では、 preview query のクエリ文字列でサービスをプレビューし、結果を VARIANT オブジェクトにパースしています。

SELECT PARSE_JSON(
  SNOWFLAKE.CORTEX.SEARCH_PREVIEW(
      'my_search_service',
      '{
         "query": "preview query",
         "columns":[
            "col1",
            "col2"
         ],
         "filter": {"@eq": {"col1": "filter value"} },
         "limit":10
      }'
  )
)['results'] as results;
Copy

アクセス制御の要件

Cortex Search Serviceをクエリするロールは、結果を取得するために以下の権限を持っている必要があります。

権限

オブジェクト

USAGE

Cortex Search Service

USAGE

Cortex Search Serviceが存在するデータベース。

USAGE

Cortex Search Serviceが存在するスキーマ。