Cortex Search Service 쿼리하기¶
Cortex Search Service를 생성하면 시스템은 낮은 대기 시간으로 쿼리를 처리하기 위해 API 엔드포인트를 프로비저닝합니다. Cortex Search Service에 대한 쿼리를 수행하려면 다음 세 가지 APIs를 사용할 수 있습니다.
매개 변수¶
APIs는 모두 동일한 쿼리 매개 변수 세트를 지원합니다.
매개 변수 |
설명 |
|
|---|---|---|
필수 |
|
서비스의 텍스트 열에서 검색할 검색어. |
선택 사항 |
|
응답에서 각 관련 결과에 대해 반환할 열의 쉼표로 구분된 목록입니다. 이 열들은 서비스의 소스 쿼리에 반드시 포함되어야 합니다. 이 매개 변수가 제공되지 않으면 응답에는 검색 열만 반환됩니다. |
|
|
|
|
검색 순위 지정 동작을 사용자 지정하기 위한 구성 오브젝트입니다. 구문에 대해서는 Cortex Search Scoring 사용자 지정하기 섹션을 참조하세요. |
|
|
이전에 :doc:`ALTER CORTEX SEARCH SERVICE … ADD SCORING PROFILE </sql-reference/sql/alter-cortex-search>`로 정의된 쿼리와 함께 사용할 명명된 채점 프로필입니다. :code:`scoring_profile`이 제공되면 제공된 모든 :code:`scoring_config`가 무시됩니다. |
|
|
응답에서 반환할 최대 결과 수로, 최대 1000개입니다. 기본 제한은 10개입니다. |
구문¶
다음 예제는 세 가지 표면 모두를 사용하여 Cortex Search Service를 쿼리하는 방법을 보여줍니다.
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;
설정 및 인증¶
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: 서비스를 호출하는 메서드입니다. 이 경우에는query메서드입니다.
자세한 내용은 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 함수¶
SNOWFLAKE.CORTEX.SEARCH_PREVIEW 함수를 사용하면 워크시트나 Snowflake Notebook 셀과 같은 SQL 환경 내에서 Cortex Search Service에 대한 개별 쿼리의 결과를 미리 볼 수 있습니다. 이 함수를 사용하면 서비스가 올바르게 채워지고 합리적인 결과가 제공되는지 대화형으로 유효성을 검사할 수 있습니다.
중요
SEARCH_PREVIEW함수는 Cortex Search Service의 테스트 및 유효성 검사를 위해 제공됩니다. 최종 사용자 애플리케이션에서 검색 쿼리를 제공하기 위한 것이 아닙니다.
이 함수는 문자열 리터럴에서만 작동합니다. 배치 텍스트 데이터는 허용하지 않습니다.
이 함수의 지연 시간이 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
사용법 노트¶
소스 쿼리에서 ``NaN``(‘숫자 아님’) 값에 대한 일치는 :ref:`label-data_type_float_special_values`에 설명된 대로 처리됩니다.
19자리 이상(선행 0 제외)의 고정소수점 숫자 값은
@eq,@gte또는 ``@lte``에서 작동하지 않으며, 이러한 연산자에서는 반환되지 않습니다(단, ``@not``을 사용하면 전체 쿼리에서 반환될 수는 있음).TIMESTAMP및DATE필터는YYYY-MM-DD, 타임존 인식 날짜의 경우YYYY-MM-DD+HH:MM와 같은 형식의 값을 허용합니다. 시간대 오프셋을 지정하지 않으면 날짜는 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" } } ] }
액세스 제어 요구 사항¶
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로 반환되는 응답 페이로드의 총 크기는 다음 제한을 초과하지 않아야 합니다.
예¶
이 섹션에서는 세 가지 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" 매개 변수를 생략하십시오.