Consulta ao Cortex Search Service¶
Quando você cria um Cortex Search Service, o sistema provisiona um ponto de extremidade de API para processar as consultas em baixa latência. Você pode usar três APIs para consultar um Cortex Search Service:
Parâmetros¶
Todas as APIs oferecem suporte ao mesmo conjunto de parâmetros de consulta:
Parâmetro |
Descrição |
|
|---|---|---|
Obrigatório |
|
A consulta que será pesquisada na coluna de texto no serviço. |
Opcional |
|
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. Se esse parâmetro não for fornecido, apenas a coluna de pesquisa será retornada na resposta. |
|
Um objeto de filtro para filtrar resultados com base nos dados nas colunas |
|
|
Configuration object for customizing search ranking behavior. See Customizing Cortex Search scoring for syntax. |
|
|
O perfil de pontuação nomeado a ser usado com a consulta, previamente definido com ALTER CORTEX SEARCH SERVICE … ADD SCORING PROFILE. Se |
|
|
Maximum number of results to return in the response, up to 1000. The default limit is 10. |
Além disso, as APIs SQL e Python oferecem suporte para consultas de vários índices. O uso de parâmetros de vários índices permite refinar os resultados do Cortex Search e reduzir o custo da consulta, limitando o número de colunas pesquisadas.
Parâmetro |
Descrição |
|---|---|
|
O mapa usado para determinar quais índices consultar. Cada chave no mapa é o nome de uma coluna indexada, e cada valor é uma matriz contendo mapas que definem a consulta:
|
Nota
Os serviços Cortex Search Service de vários índices ainda podem ser pesquisados por meio da API REST ou sem o parâmetro multi_index_query. Isso causa uma pesquisa irrestrita em todas as colunas indexadas, o que afeta o custo da consulta. Para obter detalhes sobre a estimativa de custo para computação de consulta de vários índices, consulte Compreendendo os custos dos serviços Cortex Search Service - Pesquisa de vários índices.
Sintaxe¶
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;
Sintaxe de consulta de vários índices¶
A consulta somente de índices específicos ou o uso de um serviço com incorporações vetoriais para um Cortex Search Service de vários índices aplica a seguinte sintaxe:
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>"}
, ...
]
}
}
}'
);
Configuração e autenticação¶
API de Python¶
Os Cortex Search Services podem ser consultados usando a versão 0.8.0 ou posterior das Snowflake Python APIs. Consulte Snowflake Python APIs: Gerenciamento de objetos Snowflake com Python para obter mais informações sobre as Snowflake Python APIs.
Instalação da biblioteca da Snowflake Python API¶
Primeiro, instale a versão mais recente do pacote Snowflake Python APIs de PyPI. Consulte Instalação da biblioteca Snowflake Python APIs para obter instruções sobre como instalar esse pacote de PyPI.
pip install snowflake -U
Conexão com o Snowflake¶
Conecte-se ao Snowflake usando uma Session Snowpark ou um conector Python Connection e crie um objeto Root. Consulte Conexão ao Snowflake com as Snowflake Python APIs para obter mais instruções sobre como se conectar ao Snowflake. O exemplo a seguir usa o objeto Session Snowpark e um dicionário Python para configuração.
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)
Nota
A versão 0.8.0 ou posterior da biblioteca Snowflake Python APIs é necessária para consultar um Cortex Search Service.
REST API¶
O Cortex Search expõe um ponto de extremidade da API REST no conjunto de APIs REST do Snowflake. O ponto de extremidade REST gerado para um Cortex Search Service tem a seguinte estrutura:
https://<account_url>/api/v2/databases/<db_name>/schemas/<schema_name>/cortex-search-services/<service_name>:query
Onde:
<account_url>: O URL da sua conta Snowflake. Consulte Como encontrar o nome da conta e organização de uma conta para obter instruções sobre como encontrar o URL da sua conta.<db_name>: o banco de dados no qual o serviço reside.<schema_name>: esquema no qual o serviço reside.<service_name>: nome do serviço.:query: The method to invoke on the service; in this case, thequerymethod.
Para obter detalhes adicionais, consulte a referência do RESTAPI do Cortex Search Service.
Autenticação¶
As Snowflake REST APIs oferecem suporte à autenticação por meio de tokens de acesso programático (Programmatic Access Tokens, PATs), autenticação com par de chaves usando JSON Web Tokens (JWTs) e OAuth. Para obter detalhes, consulte Autenticação das Snowflake REST APIs com Snowflake.
Função 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.
Importante
A função
SEARCH_PREVIEWé fornecida para teste e validação do Cortex Search Services. Ela não se destina a atender consultas de pesquisa em um aplicativo de usuário final.
The function operates only on string literals. It does not accept batch text data.
A função tem latência maior que as APIs REST e Python.
Sintaxe do filtro¶
O Cortex Search oferece suporte à filtragem nas colunas ATTRIBUTES especificadas no comando CREATE CORTEX SEARCH SERVICE.
O Cortex Search oferece suporte a cinco operadores de correspondência:
ARRAY contains:
@containsNUMERIC ou DATE/TIMESTAMP maior ou igual a:
@gteNUMERIC ou DATE/TIMESTAMP menor ou igual a:
@lteIgualdade de chave primária:
@primarykey
Esses operadores correspondentes podem ser compostos com vários operadores lógicos:
@and@or@not
Notas de uso¶
Matching against
NaN(“not a number”) values in the source query is handled as described in Valores especiais.Os valores numéricos de ponto fixo com mais de 19 dígitos (sem incluir zeros iniciais) não funcionam com
@eq,@gteou@ltee não serão retornados por esses operadores (embora ainda possam ser retornados pela consulta geral com o uso 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.@primarykeysó é compatível com serviços configurados com uma chave primária. O valor do filtro deve ser um objeto JSON que mapeia cada coluna de chave primária para seu valor correspondente (ouNULL).
Esses operadores podem ser combinados em um único objeto de filtro.
Exemplos¶
Filtro em linhas onde a coluna do tipo cadeia de caracteres
string_colé igual ao valorvalue.{ "@eq": { "string_col": "value" } }
Filtragem para uma linha com os valores de chave primária especificados
us-west-1na colunaregioneabc123na colunaagent_id:{ "@primarykey": { "region": "us-west-1", "agent_id": "abc123" } }
Filtro em linhas onde a coluna ARRAY
array_colcontém o valorvalue.{ "@contains": { "array_col": "arr_value" } }
Filtragem de linhas em que a coluna NUMERIC
numeric_colestá entre 10,5 e 12,5 (inclusive):{ "@and": [ { "@gte": { "numeric_col": 10.5 } }, { "@lte": { "numeric_col": 12.5 } } ] }
Filtragem de linhas em que a coluna TIMESTAMP
timestamp_colestá entre2024-11-19e2024-12-19(inclusive).{ "@and": [ { "@gte": { "timestamp_col": "2024-11-19" } }, { "@lte": { "timestamp_col": "2024-12-19" } } ] }
Composição de filtros com operadores lógicos:
// 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" } } ] }
Consultas de vários índices¶
Quando criado como um Cortex Search Service de vários índices com a sintaxe CREATE CORTEX SEARCH SERVICE … TEXT INDEXES … VECTOR INDEXES, o parâmetro multi_index_query opcional é usado. Ao omitir esse parâmetro, todos os índices são utilizados na pesquisa.
Notas de uso¶
Cada índice a ser consultado é representado como um par chave-valor no mapa
multi_index_query.Pelo menos um índice vetorial deve ser fornecido em cada consulta. A consulta somente de índices de texto é um erro.
When querying a multi-index Cortex Search Service, the following behaviors apply:
AND nos campos: uma correspondência em todos os campos de texto ou vetoriais consultados é necessária para que um documento seja retornado.
OR nos termos em um campo de índice de texto: quando uma consulta contém vários termos, como «wash fold», um documento será retornado se qualquer um dos termos de consulta for encontrado no documento.
As consultas de texto são normalizadas automaticamente usando stemming, lematização e reescritas específicas de domínio por meio do analisador personalizado do Snowflake. Isso melhora o recall ao corresponder termos relacionados, como vincular «washing» a «wash» e «laundromat» a «laundry».
O campo
scoring_config.weightsmodifica o peso relativo de cada uma das 3 técnicas de pontuação de alto nível (vetor, palavra-chave, reclassificação) em uma determinada consulta.Nesse campo, os pesos são aplicados relativamente uns aos outros. Por exemplo,
{ "texts": 3, "vectors": 2, "reranker": 1 }e{ "texts": 30, "vectors": 20, "reranker": 10 }são equivalentes.Usando os campos
scoring_config.functions.vector_boostsescoring_config.functions.text_boosts:Esses campos permitem aos usuários modificar o peso relativo de cada consulta de índice vetorial e de índice de texto, respectivamente, em uma determinada consulta.
Em cada campo, os pesos são aplicados em relação uns aos outros, como em
scoring_config.weights.
Consultas de vários índices podem ser combinadas com aumentos numéricos, decrementos de tempo e consultas que desabilitam a reclassificação. Para obter informações sobre como usar esses recursos, consulte Aumentos numéricos e decréscimos de tempo e Reclassificação.
Ao consultar um serviço de vários índices, o parâmetro
querypode ser usado para especificar uma consulta a ser aplicada a todos os campos, a menos que o serviço contenha um índice vetorial com incorporações vetoriais fornecidas pelo usuário.Para otimizar o desempenho e a latência da pesquisa, as colunas contendo incorporações vetoriais não são retornadas nos resultados ao emitir uma consulta para um índice vetorial fornecido pelo usuário.
A Snowflake recomenda refinar suas consultas para usar
multi_index_queryem serviços do Cortex Search Service de vários índices para reduzir a quantidade de recursos consumidos, o que afeta o custo.Para obter informações sobre como estimar a precificação das consultas de vários índices, consulte Estimando os custos para Cortex Search de vários índices.
Requisitos de controle de acesso¶
A função que está consultando o Cortex Search Service deve ter os seguintes privilégios para recuperar resultados:
Privilégio |
Objeto |
|---|---|
USAGE |
O Cortex Search Service |
USAGE |
O banco de dados no qual o Cortex Search Service reside |
USAGE |
O esquema no qual o Cortex Search Service reside |
Consulta com direitos de proprietário¶
O Cortex Search Services realiza buscas com os direitos do proprietário e seguem o mesmo modelo de segurança de outros objetos Snowflake executados com os direitos do proprietário.
Em particular, isso significa que qualquer função com privilégios suficientes para consultar um Cortex Search Service pode consultar qualquer dado que o serviço tenha indexado, independentemente dos privilégios dessa função nos objetos subjacentes (como tabelas e exibições) referenciados na consulta de origem do serviço.
Por exemplo, para um Cortex Search Service que faz referência a uma tabela com políticas de mascaramento em nível de linha, os usuários consultores desse serviço poderão ver os resultados da pesquisa de linhas nas quais a função do proprietário tem permissão de leitura, mesmo que a função do usuário consultor não possa ler essas linhas na tabela de origem.
Tenha cuidado, por exemplo, ao conceder uma função com privilégios USAGE em um Cortex Search Service a outro usuário do Snowflake.
Limitações conhecidas¶
A consulta a um Cortex Search Service está sujeita às seguintes limitações:
Tamanho da resposta: o tamanho total da carga útil da resposta retornada de uma consulta de pesquisa para um serviço Cortex Search Service não deve exceder os seguintes limites:
REST API e Python API: 10 megabytes (MB)
Função SQL SEARCH_PREVIEW: 300 quilobytes (KB)
O Cortex Search de vários índices está sujeito a limitações adicionais, que podem mudar durante a versão preliminar:
O Cortex Search Playground na UI do Snowsight não oferece suporte a consultas em serviços de vários índices. As consultas em serviços de vários índices no Playground exibem a mensagem «Unable to query search service. Invalid request parameters or filter syntax.».
A sintaxe da consulta que atende a vários índices com o parâmetro
multi_index_queryé compatível somente nas versões 1.6.0 ou posteriores da API Python.
Exemplos¶
Esta seção apresenta exemplos abrangentes para consultar os Cortex Search Services em todos os três métodos de API.
Configuração para os exemplos¶
Os exemplos a seguir usam uma tabela chamada business_documents com carimbo de data/hora e colunas numéricas para demonstrar vários recursos:
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;
Exemplos de filtro¶
Consulta simples com filtro de igualdade¶
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;
Filtro de intervalo¶
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;
Exemplos de pontuação¶
Aumentos numéricos¶
Aplique aumentos numéricos às colunas de curtidas e comentários, com o dobro do peso de aumento nos valores de comentários em relação aos valores de curtidas.
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;
Nos resultados, observe:
Com os aumentos, o documento «Product roadmap 2024:…» é o principal resultado devido ao seu grande número de curtidas e comentários, embora tenha uma relevância ligeiramente menor para a consulta «technology»
Sem os aumentos, o resultado principal da consulta é «IT manual for employees:…»
Decréscimos de tempo¶
Aplique decréscimos de tempo com base na coluna LAST_MODIFIED_TIMESTAMP, em que:
Os documentos com os valores LAST_MODIFIED_TIMESTAMP mais recentes, em relação ao carimbo de data/hora «now», são aumentados
Os documentos com um valor LAST_MODIFIED_TIMESTAMP superior a 240 horas a partir do carimbo de data/hora «now» recebem pouco aumento
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;
Nos resultados, observe:
Com os decréscimos, o documento «Product roadmap 2024:…» é o principal resultado devido à sua recenticidade em relação ao carimbo de data/hora «now», embora tenha uma relevância ligeiramente inferior para a consulta de «technology»
Sem os decréscimos, o resultado principal da consulta é «IT manual for employees:…»
Desabilitação da reclassificação¶
Para desabilitar a reclassificação:
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;
Dica
Para consultar um serviço com o mecanismo de classificação, omita o parâmetro "reranker": "none" do objeto scoring_config, pois a reclassificação é o comportamento padrão.
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.
Consultar um serviço com incorporações vetoriais gerenciadas¶
Os exemplos nesta seção usam as seguintes definições de business_directory e example_search_service:
-- 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 );
Consultar índices específicos¶
Para consultar example_search_service no campo de texto name e no campo vetorial 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. |
+---------------------+-----------------------------+--------------------------------------------------------------------------+
Consultar apenas uma coluna vetorial gerenciada¶
Para consultar o example_search_service por «refurbished components for PCs» na description do índice vetorial usando incorporações gerenciadas:
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¶
Para consultar o example_search_service por «sparkle» no name do índice de texto e por «clothing washing» na description do índice vetorial, ponderando a pontuação vetorial como quatro vezes mais relevante que o texto ou a reclassificação:
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. |
+---------------------+-----------------------------+--------------------------------------------------------------------------+
Como o peso da coluna description do índice vetorial é maior que o peso de qualquer coluna text, a empresa mais associada a «clothes washing» aparece acima da empresa que contém «sparkle» no nome.
Consulta com índices ponderados individualmente¶
Para consultar o example_search_service com «circuit» em todos os campos, aplicando um peso relativo para aumentar as correspondências na coluna name em relação à coluna 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. |
+---------------------+-----------------------------+--------------------------------------------------------------------------+
Observe que aumentar o nome acima do endereço classifica a empresa chamada «Circuit Town» acima da empresa localizada em um endereço «Circuit Blvd».
Consultar um serviço com incorporações vetoriais personalizadas¶
Os exemplos nesta seção usam as seguintes definições de business_documents e example_search_service:
-- 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;
Nota
Esses exemplos usam incorporações simuladas para simplificar. Em um caso de uso de produção, os vetores devem ser gerados por meio de um modelo de incorporação vetorial do Snowflake ou um modelo de incorporação hospedado externamente.
Consultar um índice com incorporações personalizadas¶
Para consultar o example_search_service com «IT» e uma incorporação correspondente na coluna document_contents e 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. |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
