Cortex Search Service 쿼리하기¶
Cortex Search Service를 생성하면 시스템은 낮은 대기 시간으로 쿼리를 처리하기 위해 API 엔드포인트를 프로비저닝합니다. Cortex Search Service에 대한 쿼리를 수행하려면 다음 세 가지 APIs를 사용할 수 있습니다.
매개 변수¶
APIs는 모두 동일한 쿼리 매개 변수 세트를 지원합니다.
매개 변수 |
설명 |
|
|---|---|---|
필수 |
|
서비스의 텍스트 열에서 검색할 검색어. |
선택 사항 |
|
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. 이 매개 변수가 제공되지 않으면 검색 열만 응답에 반환됩니다. |
|
|
|
|
Configuration object for customizing search ranking behavior. See Customizing Cortex Search scoring for syntax. |
|
|
이전에 :doc:`ALTER CORTEX SEARCH SERVICE … ADD SCORING PROFILE </sql-reference/sql/alter-cortex-search>`로 정의된 쿼리와 함께 사용할 명명된 채점 프로필입니다. :code:`scoring_profile`이 제공되면 제공된 모든 :code:`scoring_config`가 무시됩니다. |
|
|
Maximum number of results to return in the response, up to 1000. The default limit is 10. |
또한, SQL 및 Python APIs는 :ref:`다중 인덱스 쿼리<label-cortex_multi_index_search>`를 지원합니다. 다중 인덱스 매개 변수를 사용하면 Cortex Search의 결과를 구체화하고 검색되는 열 수를 제한하여 쿼리 비용을 절감할 수 있습니다.
매개 변수 |
설명 |
|---|---|
|
쿼리할 인덱스를 결정하는 데 사용되는 맵입니다. 맵의 각 키는 인덱싱된 열의 이름이고, 각 값은 쿼리를 정의하는 맵이 포함된 배열입니다.
|
참고
다중 인덱스 Cortex Search 서비스는 REST API를 통해 검색하거나 multi_index_query 매개 변수 없이도 계속 검색할 수 있습니다. 이로 인해 모든 인덱싱된 열에 대해 무제한 검색이 수행되어 쿼리 비용에 영향을 줍니다. 다중 인덱스 쿼리 컴퓨팅의 비용 추정에 대한 자세한 내용은 :ref:`Cortex Search Services의 비용 이해하기 - 다중 인덱스 검색<label-cortex_search_multi_index_estimate_cost>`을 참조하세요.
구문¶
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;
다중 인덱스 쿼리 구문¶
특정 인덱스만 쿼리하거나 다중 인덱스 Cortex Search Service에 대해 벡터 임베딩이 포함된 서비스를 사용하는 경우 다음 구문을 사용합니다.
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>"}
, ...
]
}
}
}'
);
설정 및 인증¶
Python API¶
Cortex Search Service는 Snowflake Python APIs 버전 0.8.0 이상을 사용하여 쿼리할 수 있습니다. Snowflake Python APIs에 대한 자세한 내용은 :doc:`Snowflake Python APIs: Python을 사용한 Snowflake 오브젝트 관리</developer-guide/snowflake-python-api/snowflake-python-overview>`를 참조하세요.
Snowflake Python API 라이브러리 설치하기¶
먼저, PyPI로부터 Snowflake Python APIs 패키지의 최신 버전을 설치하세요. 이 패키지를 PyPI로부터 설치하는 방법은 :doc:`Snowflake Python APIs 라이브러리 설치</developer-guide/snowflake-python-api/snowflake-python-installing>`를 참조하세요.
pip install snowflake -U
Snowflake에 연결하기¶
Snowpark Session 또는 Python Connector Connection 을 사용하여 Snowflake에 연결하고 Root 오브젝트를 생성합니다. Snowflake에 연결하는 방법에 대한 자세한 내용은 Snowflake Python APIs를 사용하여 Snowflake에 연결</developer-guide/snowflake-python-api/snowflake-python-connecting-snowflake>`을 참조하세요. 다음 예제에서는 Snowpark ``Session` 오브젝트와 Python 사전을 사용하여 구성합니다.
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)
참고
Cortex Search Service를 쿼리하려면 Snowflake Python APIs 라이브러리 버전 0.8.0 이상이 필요합니다.
REST API¶
Cortex Search는 Snowflake REST APIs 의 제품군에서 REST API 엔드포인트를 노출합니다. Cortex Search Service에 대해 생성된 REST 엔드포인트는 다음과 같은 구조로 되어 있습니다.
https://<account_url>/api/v2/databases/<db_name>/schemas/<schema_name>/cortex-search-services/<service_name>:query
여기서
<account_url>: 귀하의 Snowflake 계정 URL. 계정 URL을 찾는 방법에 대한 자세한 내용은 :ref:`계정의 조직 및 계정 이름 찾기<label-account_name_find>`를 참조하세요.<db_name>: 서비스가 있는 데이터베이스입니다.<schema_name>: 서비스가 있는 스키마입니다.<service_name>: 서비스의 이름입니다.:query: The method to invoke on the service; in this case, thequerymethod.
자세한 내용은 RESTCortex Search Service API` 에 대한 <https://docs.snowflake.com/developer-guide/snowflake-rest-api/reference/cortex-search-service> `_ 참조를 참조하십시오.
인증¶
Snowflake REST APIs는 프로그래매틱 액세스 토큰(PATs), JSON 웹 토큰을 사용한 키 페어 인증(JWTs), OAuth를 통한 인증을 지원합니다. 자세한 내용은 :doc:`Snowflake를 사용하여 Snowflake REST APIs 인증</developer-guide/snowflake-rest-api/authentication>`을 참조하세요.
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.
중요
SEARCH_PREVIEW함수는 Cortex Search Service의 테스트 및 유효성 검사를 위해 제공됩니다. 최종 사용자 애플리케이션에서 검색 쿼리를 제공하기 위한 것이 아닙니다.
The function operates only on string literals. It does not accept batch text data.
이 함수의 지연 시간이 REST 및 Python APIs보다 깁니다.
필터 구문¶
Cortex Search는 CREATE CORTEX SEARCH SERVICE 명령에 지정된 ATTRIBUTES 열에 대한 필터링을 지원합니다.
Cortex Search는 다섯 가지 일치하는 연산자를 지원합니다.
ARRAY contains:
@containsNUMERIC 또는 DATE/TIMESTAMP 보다 크거나 같아야 함:
@gteNUMERIC 또는 DATE/TIMESTAMP 보다 작거나 같아야 함:
@lte기본 키 동일성:
@primarykey
이러한 일치 연산자는 다양한 논리 연산자로 구성될 수 있습니다.
@and@or@not
사용법 노트¶
Matching against
NaN(‘not a number’) values in the source query is handled as described in 특수한 값.19자리 이상(선행 0 제외)의 고정소수점 숫자 값은
@eq,@gte또는 ``@lte``에서 작동하지 않으며, 이러한 연산자에서는 반환되지 않습니다(단, ``@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.@primarykey``는 :doc:`기본 키</sql-reference/constraints-overview>`로 구성된 서비스에 대해서만 지원됩니다. 필터의 값은 모든 기본 키 열을 해당 값(또는 ``NULL)에 매핑하는 JSON 오브젝트여야 합니다.
이러한 연산자를 1개의 필터 오브젝트로 결합할 수 있습니다.
예¶
문자열과 같은 열
string_col은value값과 같은 행을 필터링합니다.{ "@eq": { "string_col": "value" } }
region열에 지정된 기본 키 값us-west-1``이 있고, ``agent_id열에 ``abc123``이 있는 행으로 필터링:{ "@primarykey": { "region": "us-west-1", "agent_id": "abc123" } }
ARRAY 열
array_col에 값value가 포함된 행을 필터링합니다.{ "@contains": { "array_col": "arr_value" } }
NUMERIC 열
numeric_col이 10.5에서 12.5(포함) 사이인 행을 필터링합니다.{ "@and": [ { "@gte": { "numeric_col": 10.5 } }, { "@lte": { "numeric_col": 12.5 } } ] }
TIMESTAMP 열
timestamp_col이2024-11-19과2024-12-19(포함) 사이에 있는 행을 필터링합니다.{ "@and": [ { "@gte": { "timestamp_col": "2024-11-19" } }, { "@lte": { "timestamp_col": "2024-12-19" } } ] }
논리 연산자를 사용하여 필터 구성:
// 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" } } ] }
다중 인덱스 쿼리¶
CREATE CORTEX SEARCH SERVICE … TEXT INDEXES … VECTOR INDEXES 구문을 사용하여 다중 인덱스 Cortex Search Service로 생성된 경우 선택적 multi_index_query 매개 변수가 사용됩니다. 이 매개 변수를 생략하면 모든 인덱스가 검색에 사용됩니다.
사용법 노트¶
쿼리할 각 인덱스는
multi_index_query맵에서 키-값 페어로 표시됩니다.각 쿼리에 하나 이상의 벡터 인덱스를 제공해야 합니다. 텍스트 인덱스만 쿼리하는 것은 오류입니다.
When querying a multi-index Cortex Search Service, the following behaviors apply:
필드 간 AND 조건: 문서가 반환되려면 쿼리된 모든 텍스트 또는 벡터 필드가 일치해야 합니다.
텍스트 인덱스 필드 내 용어 간 OR 조건: 쿼리에 “wash fold”와 같은 여러 용어가 포함된 경우, 문서 내에서 쿼리 용어 중 *하나라도 발견되면 문서가 반환됩니다.
텍스트 쿼리는 Snowflake의 사용자 지정 분석기를 통해 형태소 분석, 보조 정리 및 도메인별 재작성을 사용하여 자동으로 정규화됩니다. 이를 통해 “washing”을 “wash”에 연결하고 “laundromat”를 “laundry”에 연결하는 것과 같이 관련 용어를 일치시켜 재현율을 개선합니다.
scoring_config.weights필드는 주어진 쿼리에서 3가지 상위 수준 채점 기법(벡터, 키워드, 순위 재지정) 각각의 상대적 가중치를 수정합니다.이 필드 내에서 가중치는 서로 상대적으로 적용됩니다. 예를 들어,
{ "texts": 3, "vectors": 2, "reranker": 1 }및 :code:`{ “texts”: 30, “vectors”: 20, “reranker”: 10 }`은 동등합니다.scoring_config.functions.vector_boosts및scoring_config.functions.text_boosts필드를 사용합니다.이러한 필드를 통해 사용자는 주어진 쿼리에서 각 벡터 인덱스 및 텍스트 인덱스 쿼리의 상대적 가중치를 각각 수정할 수 있습니다.
:code:`scoring_config.weights`에서와 같이 각 필드 내에서 가중치는 서로 상대적으로 적용됩니다.
다중 인덱스 쿼리는 숫자 부스트, 시간 감소, 순위 재지정을 비활성화하는 쿼리와 결합할 수 있습니다. 이러한 기능 사용에 대한 자세한 내용은 숫자 부스트 및 시간 감소 및 순위 재조정 섹션을 참조하세요.
다중 인덱스 서비스를 쿼리할 때, 서비스에 사용자 제공 벡터 임베딩이 있는 벡터 인덱스가 포함되어 있지 않는 한
query매개 변수를 사용하여 모든 필드에 적용할 쿼리를 지정할 수 있습니다.검색 성능과 대기 시간을 최적화하기 위해, 사용자 제공 벡터 인덱스에 대한 쿼리를 실행할 때 벡터 임베딩이 포함된 열은 결과에 반환되지 않습니다.
Snowflake는 비용에 영향을 미치는 리소스 사용량을 줄이기 위해 다중 인덱스 Cortex Search Service에서 ``multi_index_query``를 사용하도록 쿼리를 구체화할 것을 권장합니다.
다중 인덱스 쿼리의 가격 추정에 대한 자세한 내용은 :ref:`다중 인덱스 Cortex Search의 비용 추정하기<label-cortex_search_multi_index_estimate_cost>`를 참조하세요.
액세스 제어 요구 사항¶
Cortex Search Service를 쿼리하는 역할은 결과를 검색하기 위해 다음 권한이 있어야 합니다.
권한 |
오브젝트 |
|---|---|
USAGE |
Cortex Search Service |
USAGE |
Cortex Search Service가 있는 데이터베이스 |
USAGE |
Cortex Search Service가 있는 스키마 |
소유자 권한으로 쿼리하기¶
Cortex Search Service는 소유자의 권한 으로 검색을 수행하며 소유자의 권한으로 실행되는 다른 Snowflake 오브젝트와 동일한 보안 모델을 따릅니다.
특히, 이는 서비스의 소스 쿼리에서 참조되는 기본 오브젝트(예: 테이블 및 뷰)에 대한 해당 역할의 권한에 관계없이 Cortex Search Service를 쿼리할 수 있는 충분한 권한을 가진 모든 역할이 서비스가 인덱싱한 모든 데이터를 쿼리할 수 있다는 것을 의미합니다.
예를 들어, 행 수준 마스킹 정책이 있는 테이블을 참조하는 Cortex Search Service의 경우, 해당 서비스의 쿼리 사용자는 쿼리 사용자의 역할이 소스 테이블에서 해당 행을 읽을 수 없더라도 소유자의 역할에 읽기 권한이 있는 행의 검색 결과를 볼 수 있습니다.
예를 들어, 다른 Snowflake 사용자에게 Cortex Search Service에서 USAGE 권한이 있는 역할을 부여할 때는 주의를 기울이십시오.
알려진 제한 사항¶
Cortex Search Service 쿼리에는 다음과 같은 제한이 적용됩니다.
응답 크기: 검색 쿼리에서 Cortex Search Service로 반환되는 응답 페이로드의 총 크기는 다음 제한을 초과하지 않아야 합니다.
다중 인덱스 Cortex Search에는 추가 제한 사항이 적용되며, 미리 보기 중에 변경될 수 있습니다.
Snowsight UI의 Cortex Search Playground는 다중 인덱스 서비스에 대한 쿼리를 지원하지 않습니다. Playground에서 다중 인덱스 서비스에 대한 쿼리는 “Unable to query search service. Invalid request parameters or filter syntax.” 메시지를 표시합니다.
multi_index_query매개 변수를 사용한 다중 인덱스 제공 쿼리 구문은 Python API 버전 1.6.0 이상에서만 지원됩니다.
예¶
이 섹션에서는 세 가지 API 메서드 모두에서 Cortex Search Service를 쿼리하는 포괄적인 예시를 제공합니다.
예제를 위한 설정¶
다음 예제에서는 다양한 기능을 시연하기 위해 타임스탬프 및 숫자 열이 있는 ``business_documents``라는 테이블을 사용합니다.
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;
필터 예시¶
동일성 필터가 포함된 간단한 쿼리¶
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;
범위 필터¶
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;
점수 예시¶
숫자 부스트¶
좋아요와 댓글 열 모두에 숫자 부스트를 적용하되, 댓글 값에 대해 좋아요 값 대비 두 배의 부스트 가중치를 부여합니다.
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;
결과에서 참고하십시오.
부스트가 적용되면 “제품 로드맵 2024:…” 문서는 “기술”이라는 검색어와의 관련성은 다소 낮지만, 많은 좋아요와 댓글 덕분에 최상위 결과로 노출됩니다.
부스트가 적용되지 않으면 해당 쿼리의 최상위 결과는 “직원용 IT 매뉴얼:…”입니다.
시간 감쇠¶
다음과 같은 경우, LAST_MODIFIED_TIMESTAMP 열을 기준으로 시간 감쇠를 적용합니다.
현재 타임스탬프를 기준으로 더 최근의 LAST_MODIFIED_TIMESTAMP 값을 가진 문서가 부스트됩니다.
현재 타임스탬프로부터 LAST_MODIFIED_TIMESTAMP 값이 240시간을 초과하는 문서는 부스트가 거의 적용되지 않습니다.
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;
결과에서 참고하십시오.
감쇠가 적용되면 “제품 로드맵 2024:…” 문서는 현재 타임스탬프에 대한 최신성으로 인해 최상위 결과로 표시됩니다. 비록 “기술”이라는 쿼리에 대한 관련성은 약간 낮지만 말입니다.
감쇠가 적용되지 않으면 해당 쿼리의 최상위 결과는 “직원용 IT 매뉴얼:…”입니다.
순위 재지정 비활성화¶
순위 재지정을 비활성화하려면 다음을 수행하세요.
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;
팁
순위 재지정을 사용하여 서비스를 쿼리하려면 순위 재지정이 기본 동작이므로 scoring_config 오브젝트에서 "reranker": "none" 매개 변수를 생략하십시오.
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.
관리 벡터 임베딩으로 서비스 쿼리¶
이 섹션의 예제에서는 다음 business_directory 및 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 );
특정 인덱스 쿼리¶
name 텍스트 필드 및 description 벡터 필드에서 ``example_search_service``를 쿼리하려면 다음을 수행합니다.
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. |
+---------------------+-----------------------------+--------------------------------------------------------------------------+
관리 벡터 열만 쿼리¶
관리 임베딩을 사용하여 벡터 인덱스 :code:`description`에서 “PCs용 재정비 부품”에 대해 ``example_search_service``를 쿼리하려면 다음을 수행합니다.
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¶
텍스트 인덱스 :code:`name`에서 “sparkle”에 대해, 벡터 인덱스 :code:`description`에서 “clothing washing”에 대해 ``example_search_service``를 쿼리하고, 벡터 채점의 가중치를 텍스트 또는 순위 재지정보다 4배 더 관련성이 높게 설정하려면 다음을 수행합니다.
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. |
+---------------------+-----------------------------+--------------------------------------------------------------------------+
description 벡터 인덱스 열의 가중치가 text 열의 가중치보다 높기 때문에 “clothes washing”과 가장 관련된 비즈니스는 이름에 “sparkle”이 포함된 비즈니스 위에 표시됩니다.
개별적으로 가중치가 적용된 인덱스가 있는 쿼리¶
모든 필드에 대해 “circuit”를 사용하여 example_search_service``를 쿼리하고 ``name 열의 일치 항목에 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. |
+---------------------+-----------------------------+--------------------------------------------------------------------------+
주소보다 이름에 가중치를 적용하면 이름이 “Circuit Town”인 비즈니스가 “Circuit Blvd”의 주소에 위치한 비즈니스보다 순위가 높아집니다.
사용자 지정 벡터 임베딩으로 서비스 쿼리¶
이 섹션의 예제에서는 다음 business_documents 및 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;
참고
이러한 예제에서는 단순성을 위해 모의 임베딩을 사용합니다. 프로덕션 사용 사례에서 벡터는 Snowflake 벡터 임베딩 모델 또는 외부 호스팅 임베딩 모델을 통해 생성되어야 합니다.
사용자 지정 임베딩으로 인덱스 쿼리¶
document_contents 및 document_embedding 열에서 “IT”와 해당 임베딩으로 ``example_search_service``를 쿼리하려면 다음을 수행합니다.
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. |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
