Interroger un Cortex Search Service¶
Lorsque vous créez un Cortex Search Service, le système fournit un point de terminaison API pour servir les requêtes à faible latence. Vous pouvez utiliser trois APIs pour interroger un Cortex Search Service :
La fonction SQL SEARCH_PREVIEW
Paramètres¶
Toutes les APIs prennent en charge le même ensemble de paramètres de requête :
Paramètre |
Description |
|
|---|---|---|
Obligatoire |
|
La requête de recherche, à rechercher dans la colonne de texte du service. |
Facultatif |
|
A comma-separated list of columns to return for each relevant result in the response. These columns must be included in the source query for the service. Si ce paramètre n’est pas fourni, seule la colonne de recherche est renvoyée dans la réponse. |
|
Un objet de filtre pour filtrer les résultats en fonction des données dans les colonnes |
|
|
Configuration object for customizing search ranking behavior. See Customizing Cortex Search scoring for syntax. |
|
|
Le profil de notation nommé à utiliser avec la requête, précédemment défini avec ALTER CORTEX SEARCH SERVICE … ADD SCORING PROFILE. Si le |
|
|
Maximum number of results to return in the response, up to 1000. The default limit is 10. |
En outre, les APIs SQL et Python prennent en charge les requêtes multi-index. L’utilisation de paramètres multi-index permet d’affiner les résultats de Cortex Search et de réduire le coût des requêtes en limitant le nombre de colonnes recherchées.
Paramètre |
Description |
|---|---|
|
La carte utilisée pour déterminer les index à interroger. Chaque clé de la carte est le nom d’une colonne indexée et chaque valeur est un tableau contenant des cartes qui définissent la requête :
|
Note
Les services Cortex Search multi-index peuvent toujours être recherchés via l’API REST ou sans le paramètre multi_index_query. Cela provoque une recherche illimitée sur toutes les colonnes indexées, ce qui affecte le coût de la requête. Pour plus de détails sur l’estimation du coût de calcul des requêtes multi-index, voir Comprendre les coûts des Cortex Search Services - Recherche multi-index.
Syntaxe¶
Simple queries to a Cortex Search Service use the following syntax:
import os
from snowflake.core import Root
from snowflake.snowpark import Session
# connect to Snowflake
CONNECTION_PARAMETERS = { ... }
session = Session.builder.configs(CONNECTION_PARAMETERS).create()
root = Root(session)
# 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())
curl --location https://<ACCOUNT_URL>/api/v2/databases/<DB_NAME>/schemas/<SCHEMA_NAME>/cortex-search-services/<SERVICE_NAME>:query \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header "Authorization: Bearer $PAT" \
--data '{
"query": "<search_query>",
"columns": ["col1", "col2"],
"filter": <filter>,
"limit": <limit>
}'
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;
Syntaxe de requête multi-index¶
L’interrogation d’index spécifiques uniquement ou l’utilisation d’un service avec des intégrations vectorielles pour un service Cortex Search à index multiples utilise la syntaxe suivante :
from snowflake.core import Root
from snowflake.snowpark import Session
session = Session.builder.configs( {...} ).create()
root = Root(session)
my_service = (root
.databases["<service_database>"]
.schemas["<service_schema>"]
.cortex_search_services["<service_name>"]
)
resp = my_service.search(
multi_index_query={
"<index_name>": [
{"text": "<search_text>"},
{"vector": [<vector_values>]},
...
],
...
},
scoring_config={
"weights": {
"texts": <text_weight>,
"vectors": <vector_weight>,
"reranker": <reranker_weight>
},
"functions": {
"vector_boosts": [
{"weight": <weight>, "column": "<vector_column_name>"},
...
],
"text_boosts": [
{"weight": <weight>, "column": "<text_column_name>"},
...
]
}
},
columns=["<column_name>", "<column_name>", ...],
limit=<limit>
)
SELECT SNOWFLAKE.CORTEX.SEARCH_PREVIEW(
'<service_name>',
'{
"multi_index_query": {
"<index_name>": [
{"text": "<search_text>"},
{"vector": [<vector_values>]},
...
],
...
},
"columns": ["<column_name>", "<column_name>", ...],
"limit": <limit>,
"scoring_config": {
"weights": {
"texts": <text_weight>,
"vectors": <vector_weight>,
"reranker": <reranker_weight>
},
"functions": {
"vector_boosts": [
{"weight": <weight>, "column": "<vector_column_name>"},
...
],
"text_boosts": [
{"weight": <weight>, "column": "<text_column_name>"}
, ...
]
}
}
}'
);
Configuration et authentification¶
Python API¶
Les cortex search services peuvent être interrogés à l’aide de la version 0.8.0 ou ultérieure des APIs python snowflake. Consultez APIs python snowflake : gestion des objets snowflake avec python pour plus d’informations sur les APIs python snowflake.
Installer la bibliothèque API Python Snowflake¶
Tout d’abord, installez la dernière version du paquet des APIs’ python snowflake depuis PyPI. Consultez installer la bibliothèque des APIs python snowflake pour obtenir des instructions sur l’installation de ce paquet à partir de PyPI.
pip install snowflake -U
Se connecter à Snowflake¶
Connectez-vous à Snowflake en utilisant une Session Snowpark ou une Connection Python Connector et créez un objet Root. Consultez se connecter à snowflake avec les APIs python snowflake 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)
Note
La version 0.8.0 ou ultérieure de la bibliothèque des APIs Python est nécessaire pour interroger un Cortex Search Service.
REST API¶
Cortex Search expose un point de terminaison d’API REST dans la suite des APIs REST Snowflake Cortex. 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
Où :
<account_url>: URL de votre compte Snowflake. Consultez recherche de l’organisation et du nom d’utilisateur pour un compte pour obtenir des instructions sur 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: The method to invoke on the service; in this case, thequerymethod.
Pour plus de détails, consultez la référence REST API pour le Cortex Search Service.
Authentification¶
Les APIs REST Snowflake prennent en charge l’authentification via des jetons d’accès programmatiques (PATs), l’authentification par paire de clés à l’aide des jetons web JSON (JWTs), et OAuth. Pour plus de détails, consultez Authentification des APIsREST Snowflake avec Snowflake.
Fonction SQL SEARCH_PREVIEW¶
The SNOWFLAKE.CORTEX.SEARCH_PREVIEW function allows you to preview the results of individual queries to a Cortex Search Service from within a SQL environment such as a worksheet or Snowflake notebook cell. This function makes it easy to interactively validate that a service has populated correctly and is serving reasonable results.
Important
La fonction
SEARCH_PREVIEWest fournie pour tester et valider les Cortex Search Services. Elle n’est pas destinée à servir des requêtes de recherche dans une application d’utilisateur final.
The function operates only on string literals. It does not accept batch text data.
La fonction a une latence plus élevée que les APIs REST et Python.
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 cinq opérateurs de recherche :
ARRAY contains:
@containsNUMERIC ou DATE/TIMESTAMP supérieur ou égal à :
@gteNUMERIC ou DATE/TIMESTAMP inférieur ou égal à :
@lteClé principale égalité :
@primarykey
Ces opérateurs de correspondance peuvent être composés de différents opérateurs logiques :
@and@or@not
Notes sur l’utilisation¶
Matching against
NaN(“not a number”) values in the source query is handled as described in Valeurs spéciales.les valeurs numériques à virgule fixe comportant plus de 19 chiffres (sans les zéros d’en-tête) ne fonctionnent pas avec
@eq,@gte, ou@lteet ne seront pas renvoyés par ces opérateurs (bien qu’elles puissent toujours être renvoyées par la requête globale avec l’utilisation de@not).TIMESTAMPandDATEfilters accept values of the form:YYYY-MM-DDand, for timezone aware dates:YYYY-MM-DD+HH:MM. If the timezone offset is not specified, the date is interpreted in UTC.@primarykeyest uniquement pris en charge pour les services configurés avec une clé principale. La valeur du filtre doit être un objet JSON mappant chaque colonne de clé principale avec sa valeur correspondante (ouNULL).
Ces opérateurs peuvent être combinés en un seul objet filtre.
Exemples¶
Le filtrage sur les lignes où se trouve une colonne de type chaîne
string_colest égal à la valeurvalue.{ "@eq": { "string_col": "value" } }
Filtrage sur une ligne avec les valeurs de clé principale spécifiées
us-west-1dans la colonne``region`` etabc123dans la colonneagent_id:{ "@primarykey": { "region": "us-west-1", "agent_id": "abc123" } }
Filtrage sur les lignes où la colonne ARRAY
array_colcontient de la valeurvalue.{ "@contains": { "array_col": "arr_value" } }
Filtrage des lignes dont la colonne NUMERIC
numeric_colest comprise entre 10,5 et 12,5 (inclus) :{ "@and": [ { "@gte": { "numeric_col": 10.5 } }, { "@lte": { "numeric_col": 12.5 } } ] }
Filtrer les lignes où la colonne TIMESTAMP
timestamp_colest comprise entre2024-11-19et2024-12-19(inclus).{ "@and": [ { "@gte": { "timestamp_col": "2024-11-19" } }, { "@lte": { "timestamp_col": "2024-12-19" } } ] }
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": "val2" } }, { "@contains": { "array_col": "val3" } } ] }
Requêtes multi-index¶
Lorsqu’elles sont créées en tant que service Cortex Search à index multiples avec la syntaxe CREATE CORTEX SEARCH SERVICE … TEXT INDEXES … VECTOR INDEXES, le paramètre facultatif multi_index_query est utilisé. Lorsque ce paramètre est omis, tous les index sont utilisés dans la recherche.
Notes sur l’utilisation¶
Chaque index à interroger est représenté par une paire clé-valeur dans la carte
multi_index_query.Au moins un index vectoriel doit être fourni dans chaque requête. Interroger uniquement des index de texte est une erreur.
When querying a multi-index Cortex Search Service, the following behaviors apply:
AND sur les champs : Une correspondance dans tous les champs de texte ou de vecteur interrogés est nécessaire pour qu’un document soit renvoyé.
OR sur les termes dans un champ d’index de texte : Lorsqu’une requête contient plusieurs termes tels que « laver-plier », un document est renvoyé si l’un des termes de la requête se trouve dans le document.
Les requêtes textuelles sont automatiquement normalisées à l’aide du stemming, de la lemmatisation et des réécritures spécifiques au domaine via l’analyseur personnalisé de Snowflake. Cela améliore la mémorisation en faisant correspondre les termes connexes, tels que l’association de « lavage » à « laver » et de « laverie » à « linge ».
Le champ
scoring_config.weightsmodifie le poids relatif de chacune des 3 techniques de notation de haut niveau (vecteur, mot-clé, reclassement) dans une requête donnée.Dans ce champ, les poids sont appliqués les uns par rapport aux autres. Par exemple,
{ "texts": 3, "vectors": 2, "reranker": 1 }et{ "texts": 30, "vectors": 20, "reranker": 10 }sont équivalents.Utilisation des champs
scoring_config.functions.vector_boostsetscoring_config.functions.text_boosts:Ces champs permettent aux utilisateurs de modifier le poids relatif de chaque requête d’index vectoriel et d’index de texte, respectivement, dans une requête donnée.
Dans chaque champ, les poids sont appliqués les uns par rapport aux autres, comme dans
scoring_config.weights.
Les requêtes multi-index peuvent être combinées avec des gains numériques, des diminutions de temps et des requêtes qui désactivent le reclassement. Pour obtenir des informations sur l’utilisation de ces fonctions, voir Accroissements numériques et déclins avec le temps et Reclassement.
Lors de l’interrogation d’un service multi-index, le paramètre
querypeut être utilisé pour spécifier une requête à appliquer à tous les champs, à moins que le service ne contienne un index vectoriel avec des intégrations vectorielles fournies par l’utilisateur.Pour optimiser les performances de la recherche et la latence, les colonnes contenant des intégrations vectorielles ne sont pas renvoyées dans les résultats lors de l’émission d’une requête vers un index vectoriel fourni par l’utilisateur.
Snowflake recommande d’affiner vos requêtes pour utiliser la
multi_index_querysur les services Cortex Search multi-index afin de réduire la quantité de ressources consommées, ce qui affecte les coûts.Pour plus d’informations sur l’estimation des tarifs pour les requêtes multi-index, voir Estimation des coûts pour Cortex Search multi-index.
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 |
Requête avec les droits du propriétaire¶
Les services Cortex Search Service effectuent des recherches avec les droits du propriétaire et suivent le même modèle de sécurité que les autres objets Snowflake qui s’exécutent avec les droits du propriétaire.
Plus particulièrement, cela signifie que tout rôle disposant de privilèges suffisants pour interroger un Cortex Search Service peut interroger n’importe quelle donnée indexée par le service, quels que soient les privilèges de ce rôle sur les objets sous-jacents (tels que les tables et les vues) référencés dans la requête source du service.
Par exemple, pour un Cortex Search Service qui référence une table avec des politiques de masquage au niveau des lignes, les utilisateurs effectuant des requêtes sur ce service pourront voir les résultats de la recherche à partir des lignes sur lesquelles le rôle du propriétaire dispose d’une autorisation de lecture, même si le rôle de l’utilisateur effectuant la requête ne peut pas lire ces lignes dans la table source.
Faites preuve de prudence, par exemple, lorsque vous accordez un rôle avec des privilèges USAGE sur un Cortex Search Service à un autre utilisateur Snowflake.
Limitations connues¶
L’interrogation d’un Cortex Search Service est soumise aux limitations suivantes :
Taille de la réponse : La taille totale de la charge utile de la réponse renvoyée par une requête de recherche à un Cortex Search Service ne doit pas dépasser les limites suivantes :
l’APIREST et l’API python : 10 mégaoctets (MB)
Fonction SQL SEARCH_PREVIEW : 300 kilo-octets (KB)
Cortex Search multi-index est soumis à des limitations supplémentaires, qui peuvent changer pendant la prévisualisation :
Cortex Search Playground dans UI de Snowsight ne prend pas en charge les requêtes vers les services multi-index. Les requêtes vers des services multi-index dans le Playground affichent le message « Impossible d’interroger le service de recherche. Paramètres de requête ou syntaxe de filtre non valides ».
La syntaxe de requête de service multi-index avec le paramètre
multi_index_queryn’est prise en charge que dans les versions 1.6.0 ou ultérieures de l’API Python.
Exemples¶
Cette section fournit des exemples complets pour interroger les Cortex Search Services sur les trois méthodes API.
Préparer des exemples :¶
les exemples suivants utilisent un tableau nommé business_documents avec des colonnes d’horodatage et des colonnes numériques pour illustrer diverses fonctionnalités :
CREATE OR REPLACE TABLE business_documents (
document_contents VARCHAR,
last_modified_timestamp TIMESTAMP,
created_timestamp TIMESTAMP,
likes INT,
comments INT
);
INSERT INTO business_documents (document_contents, last_modified_timestamp, created_timestamp, likes, comments)
VALUES
('Quarterly financial report for Q1 2024: Revenue increased by 15%, with expenses stable.',
'2024-01-12 10:00:00', '2024-01-10 09:00:00', 10, 20),
('IT manual for employees: Instructions for usage of internal technologies, including hardware.',
'2024-02-10 15:00:00', '2024-02-05 14:30:00', 85, 10),
('Employee handbook 2024: Updated policies on remote work, health benefits, and company culture.',
'2024-02-10 15:00:00', '2024-02-05 14:30:00', 85, 10),
('Marketing strategy document: Target audience segmentation for upcoming product launch.',
'2024-03-15 12:00:00', '2024-03-12 11:15:00', 150, 32),
('Product roadmap 2024: Key milestones for tech product development, including the launch.',
'2024-04-22 17:30:00', '2024-04-20 16:00:00', 200, 45),
('Annual performance review process guidelines: Procedures for managers to conduct employee.',
'2024-05-02 09:30:00', '2024-05-01 08:45:00', 60, 5);
CREATE OR REPLACE CORTEX SEARCH SERVICE business_documents_css
ON document_contents
WAREHOUSE = <warehouse_name>
TARGET_LAG = '1 minute'
AS SELECT * FROM business_documents;
Exemples de filtre¶
Requête simple avec un filtre d’égalité¶
resp = business_documents_css.search(
query="technology",
columns=["DOCUMENT_CONTENTS", "LIKES"],
filter={"@eq": {"REGION": "US"}},
limit=5
)
curl --location https://<ACCOUNT_URL>/api/v2/databases/<DB_NAME>/schemas/<SCHEMA_NAME>/cortex-search-services/<SERVICE_NAME>:query \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header "Authorization: Bearer $PAT" \
--data '{
"query": "technology",
"columns": ["DOCUMENT_CONTENTS", "LIKES"],
"filter": {"@eq": {"REGION": "US"}},
"limit": 5
}'
SELECT PARSE_JSON(
SNOWFLAKE.CORTEX.SEARCH_PREVIEW(
'business_documents_css',
'{
"query": "technology",
"columns": ["DOCUMENT_CONTENTS", "LIKES"],
"filter": {"@eq": {"REGION": "US"}},
"limit": 5
}'
)
)['results'] as results;
Filtre de plage¶
resp = business_documents_css.search(
query="business",
columns=["DOCUMENT_CONTENTS", "LIKES", "COMMENTS"],
filter={"@and": [
{"@gte": {"LIKES": 50}},
{"@lte": {"COMMENTS": 50}}
]},
limit=10
)
curl --location https://<ACCOUNT_URL>/api/v2/databases/<DB_NAME>/schemas/<SCHEMA_NAME>/cortex-search-services/<SERVICE_NAME>:query \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header "Authorization: Bearer $PAT" \
--data '{
"query": "business",
"columns": ["DOCUMENT_CONTENTS", "LIKES", "COMMENTS"],
"filter": {"@and": [
{"@gte": {"LIKES": 50}},
{"@lte": {"COMMENTS": 50}}
]},
"limit": 10
}'
SELECT PARSE_JSON(
SNOWFLAKE.CORTEX.SEARCH_PREVIEW(
'business_documents_css',
'{
"query": "business",
"columns": ["DOCUMENT_CONTENTS", "LIKES", "COMMENTS"],
"filter": {"@and": [
{"@gte": {"LIKES": 50}},
{"@lte": {"COMMENTS": 50}}
]},
"limit": 10
}'
)
)['results'] as results;
Exemples de notation¶
Améliorations numériques¶
Appliquez des améliorations numériques aux colonnes des J’aime et des commentaires, avec deux fois la pondération d’amélioration sur les valeurs de commentaires par rapport aux valeurs J’aime.
resp = business_documents_css.search(
query="technology",
columns=["DOCUMENT_CONTENTS", "LIKES", "COMMENTS"],
scoring_config={
"functions": {
"numeric_boosts": [
{"column": "comments", "weight": 2},
{"column": "likes", "weight": 1}
]
}
}
)
curl --location https://<ACCOUNT_URL>/api/v2/databases/<DB_NAME>/schemas/<SCHEMA_NAME>/cortex-search-services/<SERVICE_NAME>:query \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header "Authorization: Bearer $PAT" \
--data '{
"query": "technology",
"columns": ["DOCUMENT_CONTENTS", "LIKES", "COMMENTS"],
"scoring_config": {
"functions": {
"numeric_boosts": [
{"column": "comments", "weight": 2},
{"column": "likes", "weight": 1}
]
}
}
}'
SELECT PARSE_JSON(
SNOWFLAKE.CORTEX.SEARCH_PREVIEW(
'business_documents_css',
'{
"query": "technology",
"columns": ["DOCUMENT_CONTENTS", "LIKES", "COMMENTS"],
"scoring_config": {
"functions": {
"numeric_boosts": [
{"column": "comments", "weight": 2},
{"column": "likes", "weight": 1}
]
}
}
}'
)
)['results'] as results;
Dans les résultats, notez :
Avec les améliorations, le document « Feuille de route de produit 2024 :… » est le meilleur résultat en raison de son grand nombre de J’aime et de commentaires, même s’il a une pertinence légèrement moindre pour la requête « technologie ».
Sans aucune amélioration, le meilleur résultat principal de la requête est « Manuel IT pour les employés:… »
Décroissances temporelles¶
Appliquer des décroissances temporelles basées sur la colonneLAST_MODIFIED_TIMESTAMP, où :
les documents avec les valeurs LAST_MODIFIED_TIMESTAMP les plus récentes, relatives à l’horodatage actuel, sont améliorées.
les documents avec une valeur LAST_MODIFIED_TIMESTAMP supérieure à 240 heures à partir de l’horodatage actuel reçoivent peu d’amélioration
resp = business_documents_css.search(
query="technology",
columns=["DOCUMENT_CONTENTS", "LAST_MODIFIED_TIMESTAMP"],
scoring_config={
"functions": {
"time_decays": [
{"column": "LAST_MODIFIED_TIMESTAMP", "weight": 1, "limit_hours": 240, "now": "2024-04-23T00:00:00.000-08:00"}
]
}
}
)
curl --location https://<ACCOUNT_URL>/api/v2/databases/<DB_NAME>/schemas/<SCHEMA_NAME>/cortex-search-services/<SERVICE_NAME>:query \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header "Authorization: Bearer $PAT" \
--data '{
"query": "technology",
"columns": ["DOCUMENT_CONTENTS", "LAST_MODIFIED_TIMESTAMP"],
"scoring_config": {
"functions": {
"time_decays": [
{"column": "LAST_MODIFIED_TIMESTAMP", "weight": 1, "limit_hours": 240, "now": "2024-04-23T00:00:00.000-08:00"}
]
}
}
}'
SELECT PARSE_JSON(
SNOWFLAKE.CORTEX.SEARCH_PREVIEW(
'business_documents_css',
'{
"query": "technology",
"columns": ["DOCUMENT_CONTENTS", "LAST_MODIFIED_TIMESTAMP"],
"scoring_config": {
"functions": {
"time_decays": [
{"column": "LAST_MODIFIED_TIMESTAMP", "weight": 1, "limit_hours": 240, "now": "2024-04-23T00:00:00.000-08:00"}
]
}
}
}'
)
)['results'] as results;
Dans les résultats, notez :
Avec les décroissances, le document « Feuille de route de produit 2024 :… » est le meilleur résultat en raison de sa référence à l’horodatage actuel, même s’il a une pertinence légèrement inférieure à la requête « technologie ».
Sans aucune décroissance, le meilleur résultat de la requête est « Manuel IT pour les employés….. »
Désactivation du reclassement¶
Pour désactiver le reclassement :
resp = business_documents_css.search(
query="technology",
columns=["DOCUMENT_CONTENTS", "LAST_MODIFIED_TIMESTAMP"],
limit=5,
scoring_config={
"reranker": "none"
}
)
curl --location https://<ACCOUNT_URL>/api/v2/databases/<DB_NAME>/schemas/<SCHEMA_NAME>/cortex-search-services/<SERVICE_NAME>:query \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header "Authorization: Bearer $PAT" \
--data '{
"query": "technology",
"columns": ["DOCUMENT_CONTENTS", "LAST_MODIFIED_TIMESTAMP"],
"scoring_config": {
"reranker": "none"
}
}'
SELECT PARSE_JSON(
SNOWFLAKE.CORTEX.SEARCH_PREVIEW(
'business_documents_css',
'{
"query": "technology",
"columns": ["DOCUMENT_CONTENTS", "LAST_MODIFIED_TIMESTAMP"],
"scoring_config": {
"reranker": "none"
}
}'
)
)['results'] as results;
Astuce
Pour interroger un service avec le reclasseur, omettez le paramètre "reranker": "none" de l’objet scoring_config, car le reclassement est le comportement par défaut.
Multi-index query examples¶
This section provides examples for querying multi-index Cortex Search Services with a restriction on which indices to search, for the Python and SQL APIs.
Interroger un service avec des intégrations vectorielles gérées¶
Les exemples de cette section utilisent les définitions business_directory et example_search_service suivantes :
-- Search data
CREATE OR REPLACE TABLE business_directory (name TEXT, address TEXT, description TEXT);
INSERT INTO business_directory VALUES
('Joe''s Coffee', '123 Bean St, Brewtown','A cozy café known for artisan espresso and baked goods.'),
('Sparkle Wash', '456 Clean Ave, Sudsville', 'Eco-friendly car wash with free vacuum service.'),
('Tech Haven', '789 Circuit Blvd, Siliconia', 'Computer store offering the latest gadgets and tech repair services.'),
('Joe''s Wash n'' Fold', '456 Apple Ct, Sudsville', 'Laundromat offering coin laundry and premium wash and fold services.'),
('Circuit Town', '459 Electron Dr, Sudsville', 'Technology store selling used computer parts at discounted prices.')
;
-- Cortex Search Service
CREATE OR REPLACE CORTEX SEARCH SERVICE example_search_service
TEXT INDEXES name, address
VECTOR INDEXES description (model='snowflake-arctic-embed-m-v1.5')
WAREHOUSE = example_wh
TARGET_LAG = '1 hour'
AS ( SELECT * FROM business_directory );
Interroger des index spécifiques¶
Pour interroger example_search_service sur le champ de texte name et le champ vectoriel description :
resp = business_directory.search(
query="tech repair shop",
columns=["name", "description"],
limit=2
)
SELECT
value['name']::text as name, value['address']::text as address, value['description']::text as description
FROM TABLE(FLATTEN(PARSE_JSON(
SNOWFLAKE.CORTEX.SEARCH_PREVIEW(
'business_search_service',
'{
"query": "tech repair shop",
"columns": ["name", "description"],
"limit": 2
}'
))['results']));
+---------------------+-----------------------------+--------------------------------------------------------------------------+
| NAME | ADDRESS | DESCRIPTION |
|---------------------+-----------------------------+--------------------------------------------------------------------------|
| Tech Haven | 789 Circuit Blvd, Siliconia | Computer store offering the latest gadgets and tech repair services. |
| Circuit Town | 459 Electron Dr, Sudsville | Technology store selling used computer parts at discounted prices. |
+---------------------+-----------------------------+--------------------------------------------------------------------------+
Interroger uniquement une colonne vectorielle gérée¶
Pour interroger example_search_service pour « refurbished components for PCs » (composants reconditionnés pour PC) sur l’index vectoriel description en utilisant des intégrations gérées :
resp = business_directory.search(
multi_index_query={
"description": [
{"text": "refurbished components for PCs"}
]
},
columns=["name", "address", "description"],
limit=5
)
SELECT
value['name']::text as name, value['address']::text as address, value['description']::text as description
FROM TABLE(FLATTEN(PARSE_JSON(
SNOWFLAKE.CORTEX.SEARCH_PREVIEW(
'business_search_service',
'{
"multi_index_query": {
"description": [
{"text": "refurbished components for PCs"}
]
},
"columns": ["name", "address", "description"],
"limit": 5
}'
)
)['results']));
+---------------------+-----------------------------+--------------------------------------------------------------------------+
| NAME | ADDRESS | DESCRIPTION |
|---------------------+-----------------------------+--------------------------------------------------------------------------|
| Circuit Town | 459 Electron Dr, Sudsville | Technology store selling used computer parts at discounted prices. |
| Tech Haven | 789 Circuit Blvd, Siliconia | Computer store offering the latest gadgets and tech repair services. |
| Joe's Coffee | 123 Bean St, Brewtown | A cozy café known for artisan espresso and baked goods. |
| Joe's Wash n' Fold | 456 Apple Ct, Sudsville | Laundromat offering coin laundry and premium wash and fold services. |
| Sparkle Wash | 456 Clean Ave, Sudsville | Eco-friendly car wash with free vacuum service. |
+---------------------+-----------------------------+--------------------------------------------------------------------------+
Query with index weights¶
Pour interroger le example_search_service pour « Sparkle » (éclat) sur l’index de texte name et « nettoyage de linge » (clothing washing) sur l’index des vecteurs description, la notation vectorielle de poids étant quatre fois plus pertinente que le texte ou le reclassement :
resp = business_directory.search(
multi_index_query={
"name": [
{"text": "sparkle"}
],
"description": [
{"text": "clothing washing"}
]
},
scoring_config={
"weights": {
"texts": 1,
"vectors": 4,
"reranker": 1
}
},
columns=["name", "address", "description"],
limit=2
)
SELECT
value['name']::text as name, value['address']::text as address, value['description']::text as description
FROM TABLE(FLATTEN(PARSE_JSON(
SNOWFLAKE.CORTEX.SEARCH_PREVIEW(
'business_search_service',
'{
"multi_index_query": {
"name": [
{"text": "sparkle"}
],
"description": [
{"text": "clothing washing"}
]
},
"scoring_config": {
"weights": {
"texts": 1,
"vectors": 4,
"reranker": 1
}
},
"columns": ["name", "address", "description"],
"limit": 2
}'
)
)['results']));
+---------------------+-----------------------------+--------------------------------------------------------------------------+
| NAME | ADDRESS | DESCRIPTION |
|---------------------+-----------------------------+--------------------------------------------------------------------------|
| Joe's Wash n' Fold | 456 Apple Ct, Sudsville | Laundromat offering coin laundry and premium wash and fold services. |
| Sparkle Wash | 456 Clean Ave, Sudsville | Eco-friendly car wash with free vacuum service. |
+---------------------+-----------------------------+--------------------------------------------------------------------------+
Notez que, parce que le poids de la colonne de l’index vectoriel description est supérieure au poids de toute colonne text, l’entreprise la plus associée à « clothes washing » (lavage de linge), apparaît au-dessus de l’entreprise contenant « Sparkle » dans son nom.
Requête avec des index pondérés individuellement¶
Pour interroger example_search_service avec « circuit » sur tous les champs, en appliquant un poids relatif pour renforcer les correspondances dans la colonne name par rapport à la colonne description :
resp = business_directory.search(
multi_index_query={
"name": [{"text": "circuit"}],
"address": [{"text": "circuit"}],
"description": [{"text": "circuit"}]
},
scoring_config={
"functions": {
"text_boosts": [
{"column": "name", "weight": 2},
{"column": "address", "weight": 1}
]
}
},
columns=["name", "address", "description"],
limit=3
)
SELECT
value['name']::text as name, value['address']::text as address, value['description']::text as description
FROM TABLE(FLATTEN(PARSE_JSON(
SNOWFLAKE.CORTEX.SEARCH_PREVIEW(
'business_search_service',
'{
"multi_index_query": {
"name": [ {"text": "circuit"} ],
"address": [ {"text": "circuit"} ],
"description": [ {"text": "circuit"} ]
},
"scoring_config": {
"functions": {
"text_boosts": [{"column":"name", "weight": 2}, {"column":"address", "weight": 1}]
}
},
"columns": ["name", "address", "description"],
"limit": 3
}'
)
)['results']));
+---------------------+-----------------------------+--------------------------------------------------------------------------+
| NAME | ADDRESS | DESCRIPTION |
|---------------------+-----------------------------+--------------------------------------------------------------------------|
| Circuit Town | 459 Electron Dr, Sudsville | Technology store selling used computer parts at discounted prices. |
| Tech Haven | 789 Circuit Blvd, Siliconia | Computer store offering the latest gadgets and tech repair services. |
| Joe's Coffee | 123 Bean St, Brewtown | A cozy café known for artisan espresso and baked goods. |
+---------------------+-----------------------------+--------------------------------------------------------------------------+
Notez que le renforcement du nom par rapport à l’adresse classe l’entreprise nommée « Circuit Town » au-dessus de l’entreprise située à une adresse sur « Circuit Blvd ».
Interroger un service avec des intégrations vectorielles personnalisées¶
Les exemples de cette section utilisent les définitions business_documents et example_search_service suivantes :
-- Search data with only custom embeddings
CREATE OR REPLACE TABLE business_documents (
document_contents VARCHAR,
document_embedding VECTOR(FLOAT, 3)
);
INSERT INTO business_documents VALUES
('Quarterly financial report for Q1 2024: Revenue increased by 15%, with expenses stable. Highlights include strategic investments in marketing and technology.', [1, 1, 1]::VECTOR(float, 3)),
('IT manual for employees: Instructions for usage of internal technologies, including hardware and software guides and commonly asked tech questions.', [2, 2, 2]::VECTOR(float, 3)),
('Employee handbook 2024: Updated policies on remote work, health benefits, and company culture initiatives.', [2, 3, 2]::VECTOR(float, 3)),
('Marketing strategy document: Target audience segmentation for upcoming product launch.', [1, -1, -1]::VECTOR(float, 3))
;
-- Cortex Search Service
CREATE OR REPLACE CORTEX SEARCH SERVICE example_search_service
TEXT INDEXES (document_contents)
VECTOR INDEXES (document_embedding)
WAREHOUSE = example_wh
TARGET_LAG = '1 minute'
AS SELECT * FROM business_documents;
Note
Ces exemples utilisent des intégrations fictives pour plus de simplicité. Dans un cas d’utilisation en production, les vecteurs doivent être générés par le biais d’un Modèle d’intégration vectorielle Snowflake ou un modèle d’intégration hébergée en externe.
Interroger un index avec des intégrations personnalisées¶
Pour interroger example_search_service avec « »IT« » et une intégration correspondante sur les document_contents et document_embedding :
resp = business_directory.search(
multi_index_query={
"document_embedding": [ {"vector": [1, 1, 1]} ],
"document_contents": [ {"text": "IT"} ]
},
columns=["document_contents"],
limit=2
)
SELECT
value['document_contents']::text as document_contents
FROM TABLE(FLATTEN(PARSE_JSON(
SNOWFLAKE.CORTEX.SEARCH_PREVIEW(
'byov_search_service',
'{
"multi_index_query": {
"document_embedding": [ {"vector": [1, 1, 1] } ],
"document_contents": [ {"text": "IT"} ]
},
"columns": ["document_contents"],
"limit": 2
}'
)
)['results']));
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| DOCUMENT_CONTENTS |
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| IT manual for employees: Instructions for usage of internal technologies, including hardware and software guides and commonly asked tech questions. |
| Quarterly financial report for Q1 2024: Revenue increased by 15%, with expenses stable. Highlights include strategic investments in marketing and technology. |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
