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:

Parameter

Alle APIs unterstützen den gleichen Satz von Abfrageparametern:

Parameter

Beschreibung

Erforderlich

query

Die Suchabfrage, nach der in der Textspalte des Service gesucht werden soll.

Optional

columns

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.

filter

Ein Filterobjekt zum Filtern der Ergebnisse auf der Grundlage der Daten in den ATTRIBUTES-Spalten. Informationen zur Syntax finden Sie unter Filtersyntax.

scoring_config

Configuration object for customizing search ranking behavior. See Customizing Cortex Search scoring for syntax.

scoring_profile

Das benannte Scoring-Profil, das mit der Abfrage verwendet werden soll, zuvor definiert mit ALTER CORTEX SEARCH SERVICE … ADD SCORING PROFILE. Wenn scoring_profile bereitgestellt wird, werden angegebene scoring_config-Werte ignoriert.

limit

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

multi_index_query

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:

  • Wenn der Index ein Textindex oder ein verwalteter Vektorindex ist, kann das Abfrage-Array Folgendes enthalten:

    • Textabfragen: {"text": "search_text"}

    • Vektorabfragen als Einbettungsvektor: {"vector": [vector_values]}

  • Wenn der Index eine vom Benutzenden bereitgestellte Vektoreinbettungsspalte ist, kann das Abfragearray Folgendes enthalten:

    • Wenn ein query_model zum Zeitpunkt der Erstellung für automatische Einbettungen und Textabfragen angegeben wurde: {"text": "search_text"}.

    • Vektorabfragen als Einbettungsvektor: {"vector": [vector_values]}

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())
Copy

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>
)
Copy

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
Copy

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)
Copy

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
Copy

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, the query method.

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:

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, @gte oder @lte und werden von diesen Operatoren nicht zurückgegeben (obwohl sie von der Gesamtabfrage mit Verwendung von @not trotzdem zurückgegeben werden könnten).

  • TIMESTAMP and DATE filters accept values of the form: YYYY-MM-DD and, for timezone aware dates: YYYY-MM-DD+HH:MM. If the timezone offset is not specified, the date is interpreted in UTC.

  • @primarykey wird 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 (oder NULL) zuordnet.

Diese Operatoren können in einem einzigen Filterobjekt kombiniert werden.

Beispiele

  • Filtern von Zeilen, bei denen die Zeichenfolge-ähnliche Spalte string_col gleich dem Wert value ist.

    { "@eq": { "string_col": "value" } }
    
    Copy
  • Filtern einer Zeile mit den angegebenen Primärschlüsselwerten us-west-1 in der Spalte region und abc123 in der Spalte agent_id:

    { "@primarykey": { "region": "us-west-1", "agent_id": "abc123" } }
    
    Copy
  • Filtern nach Zeilen, in denen die Spalte ARRAY array_col den Wert value enthält.

    { "@contains": { "array_col": "arr_value" } }
    
    Copy
  • Filtern nach Zeilen, in denen NUMERIC Spalte numeric_col zwischen 10,5 und 12,5 (einschließlich) liegt:

    {
      "@and": [
        { "@gte": { "numeric_col": 10.5 } },
        { "@lte": { "numeric_col": 12.5 } }
      ]
    }
    
    Copy
  • Filtern nach Zeilen, in denen die Spalte TIMESTAMP timestamp_col zwischen 2024-11-19 und 2024-12-19 (einschließlich) liegt.

    {
      "@and": [
        { "@gte": { "timestamp_col": "2024-11-19" } },
        { "@lte": { "timestamp_col": "2024-12-19" } }
      ]
    }
    
    Copy
  • 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" } }
      ]
    }
    
    Copy

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_boosts und scoring_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 query verwendet 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_query fü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:

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_query wird 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;
Copy

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
)
Copy

Bereichsfilter

resp = business_documents_css.search(
    query="business",
    columns=["DOCUMENT_CONTENTS", "LIKES", "COMMENTS"],
    filter={"@and": [
        {"@gte": {"LIKES": 50}},
        {"@lte": {"COMMENTS": 50}}
    ]},
    limit=10
)
Copy

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}
            ]
        }
    }
)
Copy

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"}
            ]
        }
    }
)
Copy

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"
    }
)
Copy

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 );
Copy

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
)
Copy
+---------------------+-----------------------------+--------------------------------------------------------------------------+
|        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
)
Copy
+---------------------+-----------------------------+--------------------------------------------------------------------------+
|        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
)
Copy
+---------------------+-----------------------------+--------------------------------------------------------------------------+
|        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
)
Copy
+---------------------+-----------------------------+--------------------------------------------------------------------------+
|        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;
Copy

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
)
Copy
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                                   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.            |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+