Interroger un Cortex Search Service

Lorsque vous créez un Cortex Search Service, le point de terminaison d’une REST API est configuré pour répondre aux requêtes adressées au service. Vous avez deux options pour interroger un Cortex Search Service :

  • Utilisation de Snowflake Python APIs

  • Utilisez un client de votre choix pour interroger le point de terminaison REST directement

Snowflake Python APIs

Les Cortex Search Services peuvent être interrogés à l’aide de la version 0.8.0 ou ultérieure du Snowflake Python APIs, actuellement en avant-première. Consultez Snowflake Python APIs : gestion des objets Snowflake avec Python pour plus d’informations sur le Snowflake Python APIs.

Installez la bibliothèque Snowflake Python APIs.

Tout d’abord, installez la dernière version du paquet Snowflake Python APIs depuis PyPI. Consultez Installez la bibliothèque Snowflake Python APIs. pour obtenir des instructions sur l’installation de ce paquet à partir de PyPI.

pip install snowflake -U
Copy

Se connecter à Snowflake

Connectez-vous à Snowflake en utilisant une Session Snowpark ou une Connection Python Connector et créez un objet Root. Consultez Connexion à Snowflake avec Snowflake Python APIs pour plus d’instructions sur la connexion à Snowflake. L’exemple suivant utilise l’objet de la Session Snowpark et un dictionnaire Python pour la configuration.

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

Interroger le service

Interrogez le service en utilisant la syntaxe suivante :

# 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

Note

Version 0.8.0 ou ultérieure de la bibliothèque Snowflake Python APIs est nécessaire pour interroger un Cortex Search Service.

Rest API

Cortex Search expose un point de terminaison REST API dans la suite de Snowflake REST APIs, actuellement en avant-première. Le point de terminaison REST généré pour un Cortex Search Service présente la structure suivante :

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

Où :

  • <account_url> : L’URL de votre compte Snowflake. Consultez Recherche de l’organisation et du nom de compte pour un compte pour savoir comment trouver l’URL de votre compte.

  • <db_name> : Base de données dans laquelle réside le service.

  • <schema_name> : Schéma dans lequel réside le service.

  • <service_name> : Nom du service.

  • :query : La méthode à invoquer sur le service. Dans ce cas, la méthode query.

Pour plus de détails, consultez la référence REST API pour le Cortex Search Service. Ce qui suit décrit les paramètres et la syntaxe de filtre à utiliser lors de l’interrogation du service.

Paramètres

Paramètre

Description

query

Votre requête de recherche, pour rechercher dans la colonne de texte du service.

columns

Une liste de colonnes séparées par des virgules à renvoyer pour chaque résultat pertinent dans la réponse. Ces colonnes doivent être incluses dans la requête source du service.

filter

Un objet de filtre pour filtrer les résultats en fonction des données dans les colonnes ATTRIBUTES. Consultez Syntaxe de filtre.

limit

Nombre maximal de résultats à renvoyer dans la réponse.
La valeur maximale acceptée est 1000.
La valeur par défaut est 10.

Syntaxe de filtre

Cortex Search prend en charge le filtrage sur les colonnes ATTRIBUTES spécifiées dans la commande CREATE CORTEX SEARCH SERVICE.

Cortex Search prend en charge deux opérateurs de correspondance :

  • Égalité des chaînes : @eq

  • La table contient : @contains

Ces opérateurs de correspondance peuvent être composés de différents opérateurs logiques :

  • @and

  • @or

  • @not

Ces opérateurs peuvent être combinés en un seul objet filtre. Voici quelques exemples :

  • Le filtrage sur les lignes où se trouve une colonne de type chaîne string_col est égal à la valeur value.

    { "@eq": { "string_col": "value" } }
    
    Copy
  • Filtrage sur les lignes où la colonne ARRAY array_col contient de la valeur value.

    { "@contains": { "array_col": "arr_value" } }
    
    Copy
  • Composition de filtres avec des opérateurs logiques :

    // 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

Configurer l’authentification REST API

Les REST APIs Snowflake prennent actuellement en charge l’authentification via l’authentification par paire de clés et OAuth. Pour plus de détails, voir Authentification d”Snowflake REST APIs avec Snowflake.

Exemple d’interrogation du service

Pour interroger le service en utilisant curl et une authentification par paire de clés :

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

Note

Lors de l’interrogation de la REST API avec une authentification JWT, le rôle par défaut de l’utilisateur est utilisé. Ainsi, le rôle par défaut de l’utilisateur qui interroge le service doit avoir USAGE sur la base de données et le schéma dans lesquels réside le service, et sur le service lui-même. Le rôle d’utilisateur interrogateur n’a pas nécessairement besoin de privilèges sur les données de la requête source. Consultez Rôles utilisateur pour plus de détails sur les rôles des utilisateurs.

Service de prévisualisation avec le Fonctionnement du système SQL

La fonction SNOWFLAKE.CORTEX.SEARCH_PREVIEW vous permet de prévisualiser les résultats des requêtes individuelles adressées à un Cortex Search Service à partir d’un environnement SQL tel qu’une feuille de calcul ou une cellule de carnet Snowflake. Cette fonction permet de valider rapidement et facilement qu’un service est correctement renseigné et fournit des résultats raisonnables.

Exemple

L’exemple suivant prévisualise le service avec la chaîne de requête preview query et analyse les résultats dans un objet 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

Exigences en matière de contrôle d’accès

Le rôle qui interroge le Cortex Search Service doit disposer des privilèges suivants pour récupérer les résultats :

Privilège

Objet

USAGE

Le Cortex Search Service

USAGE

La base de données dans laquelle réside le Cortex Search Service

USAGE

Le schéma dans lequel réside le Cortex Search Service