Abfrage eines Cortex Search Service¶
Wenn Sie einen Cortex Search Service erstellen, stellt das System einen API-Endpunkt für die Verarbeitung von Abfragen mit geringer Latenz bereit. Sie können drei APIs für die Abfrage eines Cortex Search Service verwenden:
Die Python-API
Die REST-API
Parameter¶
Alle APIs unterstützen den gleichen Satz von Abfrageparametern:
Parameter |
Beschreibung |
|
|---|---|---|
Erforderlich |
|
Die Suchabfrage, nach der in der Textspalte des Service gesucht werden soll. |
Optional |
|
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. Wenn dieser Parameter nicht angegeben wird, wird in der Antwort nur die Suchspalte zurückgegeben. |
|
Ein Filterobjekt zum Filtern der Ergebnisse auf der Grundlage der Daten in den |
|
|
Configuration object for customizing search ranking behavior. See Customizing Cortex Search scoring for syntax. |
|
|
Das benannte Scoring-Profil, das mit der Abfrage verwendet werden soll, zuvor definiert mit ALTER CORTEX SEARCH SERVICE … ADD SCORING PROFILE. Wenn |
|
|
Maximum number of results to return in the response, up to 1000. The default limit is 10. |
Darüber unterstützen die SQL- und Python-APIs Multi-Index-Abfragen. Die Verwendung von Multi-Index-Parametern ermöglicht es, die Ergebnisse von Cortex Search zu verfeinern und die Abfragekosten zu reduzieren, indem die Anzahl der durchsuchten Spalten begrenzt wird.
Parameter |
Beschreibung |
|---|---|
|
Die Zuordnung, mit deren Hilfe bestimmt wird, welche Indizes abgefragt werden sollen. Jeder Schlüssel in der Zuordnung ist der Name einer indizierten Spalte, und jeder Wert ist ein Array mit Zuordnungen, die die Abfrage definieren:
|
Bemerkung
Multi-Index-Cortex Search Services können weiterhin über die REST-API oder ohne den multi_index_query-Parameter durchsucht werden. Dies verursacht eine uneingeschränkte Suche über alle indizierten Spalten, was sich auf die Abfragekosten auswirkt. Einzelheiten zur Schätzung der Kosten für die Verarbeitung von Multi-Index-Abfragen finden Sie unter Erläuterung zu den Kosten für Cortex Search Services – Multi-Index-Suche.
Syntax¶
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;
Syntax für Multi-Index-Abfragen¶
Wenn Sie nur bestimmte Indizes abfragen oder einen Service mit Vektoreinbettungen für einen Multi-Index Cortex Search Service verwenden, wird die folgende Syntax verwendet:
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>"}
, ...
]
}
}
}'
);
Einrichtung und Authentifizierung¶
Python API¶
Die Cortex Search Services können mit der Version 0.8.0 oder höher von Snowflake-Python-APIs abgefragt werden. Weitere Informationen zu den Snowflake-Python-APIs finden Sie unter Snowflake-Python-APIs: Verwalten von Snowflake-Objekten mit Python.
Snowflake-Python-API-Bibliothek installieren¶
Installieren Sie zunächst die neueste Version des Pakets der Snowflake-Python-APIs von PyPI. Eine Anleitung zur Installation dieses Pakets von PyPI finden Sie unter Installieren der Bibliothek von Snowflake-Python-APIs.
pip install snowflake -U
Mit Snowflake verbinden¶
Stellen Sie die Verbindung zu Snowflake entweder über einen Snowpark-Session oder einen Python Connector Connection her und erstellen Sie ein Root Objekt. Weitere Anweisungen zum Verbinden mit Snowflake finden Sie unter Verbindung zu Snowflake über Snowflake-Python-APIs. Das folgende Beispiel verwendet das Snowpark Session-Objekt und ein Python Wörterbuch für die Konfiguration.
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)
Bemerkung
Um einen Cortex Search Service abzufragen, ist Version 0.8.0 oder höher der Bibliothek für Snowflake-Python-APIs erforderlich.
REST-API¶
Cortex Search stellt einen REST API-Endpunkt in der Suite von Snowflake REST APIs zur Verfügung. Der für einen Cortex Search Service generierte REST-Endpunkt hat die folgende Struktur:
https://<account_url>/api/v2/databases/<db_name>/schemas/<schema_name>/cortex-search-services/<service_name>:query
Wobei:
<account_url>: Die URL Ihres Snowflake-Kontos. Informationen dazu, wie Sie die URL Ihres Kontos finden, erhalten Sie unter Suchen von Organisations- und Kontonamen eines Kontos.<db_name>: Datenbank, in der sich der Dienst befindet.<schema_name>: Schema, in dem sich der Dienst befindet<service_name>: Name des Dienstes.:query: The method to invoke on the service; in this case, thequerymethod.
Weitere Einzelheiten finden Sie in der REST API-Referenz für Cortex Search Service.
Authentifizierung¶
Snowflake-REST-APIs unterstützen die Authentifizierung über programmgesteuerte Zugriffstoken (PATs), die Schlüsselpaar-Authentifizierung mit JSON Web Token (JWTs) sowie OAuth. Weitere Informationen dazu finden Sie unter Authentifizierung von Snowflake-REST-APIs mit Snowflake.
SQL-SEARCH_PREVIEW-Funktion¶
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.
Wichtig
Die
SEARCH_PREVIEW-Funktion wird zum Testen und Validieren von Cortex Search Services bereitgestellt. Sie ist nicht für die Bereitstellung von Suchabfragen in einer Endbenutzer-Anwendung vorgesehen.
The function operates only on string literals. It does not accept batch text data.
Die Funktion hat eine höhere Latenzzeit als die REST- und Python-APIs.
Filtersyntax¶
Cortex Search unterstützt das Filtern nach den ATTRIBUTES-Spalten, die im Befehl :doc:` CREATE CORTEX SEARCH SERVICE </sql-reference/sql/create-cortex-search>` angegeben sind.
Cortex Search unterstützt fünf Vergleichsoperatoren:
ARRAY contains:
@containsNUMERIC oder DATE/TIMESTAMP größer oder gleich:
@gteNUMERIC oder DATE/TIMESTAMP kleiner oder gleich:
@ltePrimärschlüssel Gleichheit:
@primarykey
Diese Vergleichsoperatoren können mit verschiedenen logischen Operatoren kombiniert werden:
@and@or@not
Nutzungshinweise¶
Matching against
NaN(‚not a number‘) values in the source query is handled as described in Besondere Werte.Numerische Festkommawerte mit mehr als 19 Ziffern (einschließlich führender Nullen) funktionieren nicht mit
@eq,@gteoder@lteund werden von diesen Operatoren nicht zurückgegeben (obwohl sie von der Gesamtabfrage mit Verwendung von@nottrotzdem zurückgegeben werden könnten).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.@primarykeywird nur für Services unterstützt, die mit einem Primärschlüssel konfiguriert wurden. Der Wert des Filters muss ein JSON-Objekt sein, das jede Primärschlüsselspalte ihrem entsprechenden Wert (oderNULL) zuordnet.
Diese Operatoren können in einem einzigen Filterobjekt kombiniert werden.
Beispiele¶
Filtern von Zeilen, bei denen die Zeichenfolge-ähnliche Spalte
string_colgleich dem Wertvalueist.{ "@eq": { "string_col": "value" } }
Filtern einer Zeile mit den angegebenen Primärschlüsselwerten
us-west-1in der Spalteregionundabc123in der Spalteagent_id:{ "@primarykey": { "region": "us-west-1", "agent_id": "abc123" } }
Filtern nach Zeilen, in denen die Spalte ARRAY
array_colden Wertvalueenthält.{ "@contains": { "array_col": "arr_value" } }
Filtern nach Zeilen, in denen NUMERIC Spalte
numeric_colzwischen 10,5 und 12,5 (einschließlich) liegt:{ "@and": [ { "@gte": { "numeric_col": 10.5 } }, { "@lte": { "numeric_col": 12.5 } } ] }
Filtern nach Zeilen, in denen die Spalte TIMESTAMP
timestamp_colzwischen2024-11-19und2024-12-19(einschließlich) liegt.{ "@and": [ { "@gte": { "timestamp_col": "2024-11-19" } }, { "@lte": { "timestamp_col": "2024-12-19" } } ] }
Zusammenstellen von Filtern mit logischen Operatoren:
// 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" } } ] }
Multi-Index-Abfragen¶
Wenn die Erstellung als Multi-Index-Cortex Search Service anhand der Syntax CREATE CORTEX SEARCH SERVICE … TEXT INDEXES … VECTOR INDEXES erfolgt ist, wird der optionale Parameter multi_index_query verwendet. Wenn Sie diesen Parameter weglassen, werden alle Indizes bei der Suche verwendet.
Nutzungshinweise¶
Jeder abzufragende Index wird als Schlüssel-Wert-Paar in der
multi_index_query-Zuordnung dargestellt.In jeder Abfrage muss mindestens ein Vektorindex angegeben werden. Das Abfragen nur reinen Textindizes ist ein Fehler.
When querying a multi-index Cortex Search Service, the following behaviors apply:
AND über Felder hinweg: Eine Übereinstimmung in allen abgefragten Text- oder Vektorfeldern ist erforderlich, damit ein Dokument zurückgegeben werden kann.
OR über Begriffe innerhalb eines Textindexfelds hinweg: Wenn eine Abfrage mehrere Begriffe enthält, wie z. B. „wash fold,“ wird ein -Dokument zurückgegeben, wenn beliebige der Abfragebegriffe in dem Dokument gefunden werden.
Textabfragen werden mithilfe des benutzerdefinierten Analyzers von Snowflake automatisch durch Stemming, Lemmatisierung und domänenspezifische Umschreibungen normalisiert. Dies verbessert den Rückruf, indem verwandte Begriffe abgeglichen werden, z. B. die Verknüpfung von „washing“ mit „wash“ und „laundromat“ mit „laundry“.
Das Feld
scoring_config.weightsändert die relative Gewichtung jedes der drei High-Level-Bewertungsverfahren (Vektor, Schlüsselwort, Rangänderung) in einer bestimmten Abfrage.Innerhalb dieses Feldes werden die Gewichtungen relativ zueinander angewendet. Beispiel:
{ "texts": 3, "vectors": 2, "reranker": 1 }und{ "texts": 30, "vectors": 20, "reranker": 10 }sind äquivalent.Verwenden der Felder
scoring_config.functions.vector_boostsundscoring_config.functions.text_boosts:Mit diesen Feldern können Benutzende die relative Gewichtung jeder Vektorindex- bzw. Textindexabfrage in einer bestimmten Abfrage ändern.
Innerhalb jedes Felds werden die Gewichtungen relativ zueinander angewendet, wie in
scoring_config.weights.
Multi-Index-Abfragen können mit numerischen Erhöhungen, Zeitverfall und Abfragen kombiniert werden, die die Neusortierung deaktivieren. Weitere Informationen zur Verwendung dieser Features finden Sie unter Numerische Erhöhungen und Zeitabfälle und Neueinstufung.
Wenn Sie einen Multi-Index-Service abfragen, kann der Parameter
queryverwendet werden, um eine Abfrage anzugeben, die auf alle Felder angewendet werden soll, es sei denn, der Service enthält einen Vektorindex mit vom Benutzenden bereitgestellten Vektoreinbettungen.Um die Performance bei der Suche und die Latenz zu optimieren, werden Spalten mit Vektoreinbettungen nicht in den Ergebnissen zurückgegeben, wenn eine Abfrage an einen vom Benutzenden bereitgestellten Vektorindex ausgeführt wird.
Snowflake empfiehlt, Ihre Abfragen so zu verfeinern, dass sie die
multi_index_queryfür Multi-Index-Cortex Search Services verwenden, um den Verbrauch von Ressourcen zu reduzieren, was sich auf die Kosten auswirkt.Weitere Informationen zur Schätzung der Preise für Multi-Index-Abfragen finden Sie unter Abschätzen der Kosten für Multi-Index-Cortex Search.
Anforderungen an die Zugriffssteuerung¶
Die Rolle, die den Cortex Search Service abfragt, muss über die folgenden Berechtigungen verfügen, um Ergebnisse abrufen zu können:
Berechtigung |
Objekt |
|---|---|
USAGE |
Der Cortex Search Service |
USAGE |
Die Datenbank, in der sich der Cortex Search Service befindet |
USAGE |
Das Schema, in dem sich der Cortex Search Service befindet |
Abfragen mit Eigentümerrechten¶
Cortex Search Services führen Suchvorgänge mit den Rechten des Eigentümers durch und folgen demselben Sicherheitsmodell wie andere Snowflake-Objekte, die mit den Rechten des Eigentümers laufen.
Dies bedeutet insbesondere, dass jede Rolle, die über ausreichende Berechtigungen für die Abfrage eines Cortex Search Service verfügt, alle vom Dienst indizierten Daten abfragen kann, unabhängig von den Berechtigungen dieser Rolle für die zugrunde liegenden Objekte (wie Tabellen und Ansichten), auf die in der Quellabfrage des Dienstes verwiesen wird.
Bei einem Cortex Search Service, der auf eine Tabelle mit Maskierungsrichtlinien auf Zeilenebene verweist, können abfragende Benutzer dieses Dienstes beispielsweise Suchergebnisse von Zeilen sehen, auf die die Rolle des Eigentümers eine Leseberechtigung hat, auch wenn die Rolle des abfragenden Benutzers diese Zeilen in der Quelltabelle nicht lesen kann.
Seien Sie vorsichtig, wenn Sie z. B. einem anderen Snowflake-Benutzer eine Rolle mit USAGE-Berechtigungen auf einem Cortex Search Service gewähren.
Bekannte Einschränkungen¶
Die Abfrage eines Cortex Search Service unterliegt den folgenden Beschränkungen:
Antwortgröße: Die Gesamtgröße der Antwort-Nutzlast, die von einer Abfrage an einen Cortex Search Service zurückgegeben wird, darf die folgenden Grenzen nicht überschreiten:
REST-API und Python-API: 10 Megabyte (MB)
SQL-SEARCH_PREVIEW-Funktion: 300 Kilobyte (KB)
Die Multi-Index-Cortex Search unterliegt zusätzlichen Einschränkungen, die sich während der Vorschau ändern können:
Cortex Search Playground in der Snowsight-UI unterstützt keine Abfragen für Multi-Index-Services. Abfragen für Multi-Index-Services im Playground zeigen die Meldung „Unable to query search service. Invalid request parameters or filter syntax.“
Die Abfragesyntax für Multi-Index-Services mit dem Parameter
multi_index_querywird nur in den Versionen 1.6.0 oder höher der Python-API unterstützt.
Beispiele¶
Dieser Abschnitt enthält umfassende Beispiele für die Abfrage von Cortex Search Services mit allen drei API-Methoden.
Einrichtung für die Beispiele¶
Die folgenden Beispiele verwenden eine Tabelle namens business_documents mit Zeitstempel- und numerischen Spalten zur Veranschaulichung verschiedener Funktionen:
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;
Filtern von Beispielen¶
Einfache Abfrage mit einem Gleichheitsfilter¶
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;
Bereichsfilter¶
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;
Bewertungsbeispiele¶
Numerische Erhöhungen¶
Wenden Sie numerische Erhöhungen auf die Spalten „likes“ und „comments“ an, wobei die Erhöhungsgewichtung für Kommentare doppelt so hoch ist wie für Likes.
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;
Beachten Sie bei den Ergebnissen:
Mit den Erhöhungen hat das Dokument „Product roadmap 2024:..“ aufgrund seiner großen Anzahl von Likes und Kommentaren das höchste Ergebnis, auch wenn es eine etwas geringere Relevanz für die Abfrage „technology“ aufweist.
Ohne Erhöhungen ist das beste Ergebnis für die Abfrage „IT manual for employees:..“.
Zeitabfälle¶
Wenden Sie Zeitabfälle auf der Grundlage der Spalte LAST_MODIFIED_TIMESTAMP an, wobei Folgendes gilt:
Dokumente mit neueren LAST_MODIFIED_TIMESTAMP-Werten, relativ zum aktuellen Zeitstempel, werden erhöht.
Dokumente mit einem LAST_MODIFIED_TIMESTAMP-Wert, der höher als 240 Stunden ab dem aktuellen Zeitstempel ist, erhalten nur wenig Erhöhung.
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;
Beachten Sie bei den Ergebnissen:
Mit den Zeitabfällen hat das Dokument „Product roadmap 2024:..“ aufgrund seiner Nähe zum aktuellen Zeitstempel das höchste Ergebnis, auch wenn es eine etwas geringere Relevanz für die Abfrage „technology“ aufweist.
Ohne Zeitabfälle ist das beste Ergebnis für die Abfrage „IT manual for employees:..“.
Deaktivieren des erneuten Rankings¶
So deaktivieren Sie das erneute Ranking:
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;
Tipp
Um einen Dienst mit dem Neueinstufer abzufragen, lassen Sie den Parameter "reranker": "none" aus dem Objekt scoring_config weg, da die Neueinstufung das Standardverhalten ist.
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.
Abfrage eines Services mit verwalteten Vektoreinbettungen¶
Die Beispiele in diesem Abschnitt verwenden die folgenden business_directory- und example_search_service-Definitionen:
-- 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 );
Abfrage bestimmter Indizes¶
Abfragen von example_search_service über das Textfeld name und das Vektorfeld 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. |
+---------------------+-----------------------------+--------------------------------------------------------------------------+
Abfrage nur einer verwalteten Vektorspalte¶
Abfragen von example_search_service zu „refurbished components for PCs“ über den Vektorindex description anhand von verwalteten Einbettungen:
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¶
Abfragen von example_search_service zu „sparkle“ über den Textindex name und „clothing washing“ über den Vektorindex description, wobei die Vektorbewertung vierfach höher als relevant gewichtet wird als Text oder ein erneutes Ranking:
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. |
+---------------------+-----------------------------+--------------------------------------------------------------------------+
Beachten Sie, dass aufgrund der höheren Gewichtung der description-Vektorindexspalte als der Gewichtung einer beliebigen text-Spalte das Unternehmen, das am häufigsten mit „clothes washing“ verknüpft ist, über dem Unternehmen angezeigt wird, das „sparkle“ in seinem Namen enthält.
Abfrage mit individuell gewichteten Indizes¶
Abfragen von example_search_service zu „circuit“ über alle Felder hinweg, wobei eine relative Gewichtung angewendet wird, um mehr Übereinstimmungen in der Spalte name als in der Spalte description zu erzielen:
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. |
+---------------------+-----------------------------+--------------------------------------------------------------------------+
Beachten Sie, dass bei der Bevorzugung des Namens über die Adresse die Firma mit dem Namen „Circuit Town“ über dem Unternehmen mit der Adresse „Circuit Blvd“ eingestuft wird.
Abfrage eines Services mit benutzerdefinierten Vektoreinbettungen¶
Die Beispiele in diesem Abschnitt verwenden die folgenden business_documents- und example_search_service-Definitionen:
-- 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;
Bemerkung
In diesen Beispielen werden der Einfachheit halber gemockte Einbettungen verwendet. In einem Anwendungsfall für die Produktion sollten Vektoren über ein Snowflake-Vektoreinbettungsmodell oder ein extern gehostetes Einbettungsmodell generiert werden.
Abfrage eines Index mit benutzerdefinierten Einbettungen¶
Abfragen von example_search_service mit „IT“ und einer entsprechenden Einbettung über die Spalte document_contents und 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. |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
