이 페이지에서는 전체 텍스트 검색의 일부로 쿼리 개선을 사용하는 방법을 설명합니다.
관련 검색 결과를 찾을 가능성을 높이기 위해 Spanner는 관련 용어, 동의어, 맞춤법 교정을 포함하도록 검색어를 확장하는 고급 기능을 제공합니다. Spanner는 쿼리 개선을 위해 다음 옵션을 제공합니다.
향상된 쿼리
향상된 쿼리를 사용하려면 SEARCH 함수에서 enhance_query=>true를 설정하세요. 그런 다음 Spanner는 관련 검색어와 동의어를 포함하고, 어간 추출을 적용하고, 맞춤법을 수정하여 검색어를 자동으로 확장합니다. 예를 들어 향상된 검색어를 사용하면 hotl cal 검색어가 Hotel California 앨범과 일치합니다.
GoogleSQL
SELECT AlbumId
FROM Albums
WHERE SEARCH(AlbumTitle_Tokens, 'hotl cal', enhance_query=>true)
PostgreSQL
SELECT albumid
FROM albums
WHERE spanner.search(albumtitle_tokens, 'hotl cal', enhance_query=>true)
enhance_query는 토큰화에 영향을 미치지 않는 쿼리 시간 옵션입니다.
enhance_query 유무와 관계없이 같은 검색 색인을 사용할 수 있습니다.
Google은 쿼리 개선 알고리즘을 지속적으로 개선하고 있습니다. 따라서 시간이 경과하면 enhance_query => true가 포함된 쿼리에서 약간 다른 결과를 생성할 수 있습니다.
enhance_query을 사용하면 검색어를 확장하고 결과로 생성된 더 큰 쿼리를 실행하는 오버헤드로 인해 지연 시간이 늘어날 수 있습니다.
맞춤 사전
Spanner 전체 텍스트 검색에서 맞춤 사전을 사용하여 데이터 세트의 용어에 대한 동의어를 정의할 수 있습니다. 이는 동의어, 약어, 동등한 용어, 기타 단어 변형을 포착하여 검색 결과의 검색을 개선하는 데 유용합니다.
맞춤 사전 테이블 만들기
맞춤 사전은 용어와 동의어의 키-값 쌍이 포함된 사용자 생성 표입니다. 이를 만들려면 CREATE TABLE 문에 fulltext_dictionary_table = true 옵션을 포함하세요. 표에는 다음 두 개의 열이 있어야 합니다.
Key: 동의어로 확장할 용어의 null이 아닌 문자열 열입니다.Value: 키의 동의어 배열을 위한 null이 아닌 문자열 배열 열입니다.
표에는 Key 및 Value 이외의 열이 있을 수 없습니다.
검색어가 사전의 Key와 일치하면 검색어가 Value의 모든 해당 동의어와 핵심 용어 자체를 포함하도록 확장됩니다.
다음 예시에서는 MyCustomDictionary이라는 맞춤 사전 테이블을 만듭니다. 생성 중에 이 테이블에 테이블 옵션 fulltext_dictionary_table=true도 설정해야 합니다.
GoogleSQL
CREATE TABLE MyCustomDictionary (
Key STRING(MAX) NOT NULL,
Value ARRAY<STRING(MAX)> NOT NULL,
) PRIMARY KEY(Key),
OPTIONS (fulltext_dictionary_table = true);
PostgreSQL
CREATE TABLE mycustomdictionary (
key character varying NOT NULL,
value character varying [] NOT NULL,
PRIMARY KEY(key)
) WITH ( type = 'fulltext_dictionary')
표를 만든 후 동의어를 삽입합니다.
GoogleSQL
INSERT INTO MyCustomDictionary (Key, Value) VALUES
('album', ['vinyl', 'cassette']),
('edm', ['electronic dance music']);
PostgreSQL
INSERT INTO mycustomdictionary (key, value) VALUES
('album', ARRAY['vinyl', 'cassette']),
('edm', ARRAY['electronic dance music']);
표를 채울 때는 다음 사항에 유의하세요.
- 키는 단일 단어여야 합니다.
- 값은 단일 단어 또는 여러 단어로 구성된 구문일 수 있습니다. 값에 여러 단어가 포함된 경우 검색어 확장 중에 구문 검색으로 처리됩니다.
- 모든 키와 값은 소문자여야 합니다. 이렇게 하면 기본 토큰화 도구에 의해 소문자로 변환되는 검색 토큰과 일치합니다.
검색어 확장은 검색어가 Key와 일치하는 경우에만 발생합니다. 검색어가 Value의 동의어와 일치하지만 Key와 일치하지 않으면 검색이 확장되지 않습니다. vinyl 또는 cassette을 검색할 때 album도 찾을 수 있도록 양방향 매핑이 필요한 경우 사전 테이블에 역방향 매핑도 삽입해야 합니다. 다음 예에서는 album, vinyl, cassette의 양방향 매핑을 삽입하는 방법을 보여줍니다.
GoogleSQL
INSERT INTO MyCustomDictionary (Key, Value)
-- 1. Insert album -> vinyl, cassette
SELECT 'album', ['vinyl', 'cassette']
UNION ALL
-- 2. Insert vinyl -> album and cassette -> album
SELECT syn, ['album']
FROM UNNEST(['vinyl', 'cassette']) AS syn;
PostgreSQL
INSERT INTO mycustomdictionary (key, value)
-- 1. Insert album -> vinyl, cassette
SELECT 'album', ARRAY['vinyl', 'cassette']
UNION ALL
-- 2. Insert vinyl -> album and cassette -> album
SELECT syn, ARRAY['album']
FROM unnest(ARRAY['vinyl', 'cassette']) AS syn;
검색어에 맞춤 사전 사용
맞춤 사전을 사용하려면 SEARCH 함수의 dictionary 인수에 사전 테이블 이름을 지정합니다.
검색어가 사전의 키인 경우
SEARCH는 해당 값도 찾습니다.album이라는 용어는vinyl또는cassette가 포함된 메시지와 일치합니다.GoogleSQL
SELECT MessageId, Body FROM Messages WHERE SEARCH(Body_Tokens, 'album', dictionary=>'MyCustomDictionary');PostgreSQL
SELECT messageid, body FROM messages WHERE spanner.search(body_tokens, 'album', dictionary=>'mycustomdictionary');사전 값에
edm키의electronic dance music와 같은 여러 단어가 포함된 경우 구문 검색으로 처리됩니다. 즉, 검색어가 인접한 상태로 지정된 정확한 순서로 표시되어야 일치로 간주됩니다. 예를 들어 다음 쿼리는 정확한 구문 'electronic dance music'이 포함된 결과를 반환하지만 'dance electronic music'은 일치하지 않습니다. 이는 주로 약어를 확장하는 데 유용하며 다음과 같은 방식으로 사용할 수 있습니다.GoogleSQL
SELECT MessageId, Body FROM Messages WHERE SEARCH(Body_Tokens, 'edm', dictionary=>'MyCustomDictionary');PostgreSQL
SELECT messageid, body FROM messages WHERE spanner.search(body_tokens, 'edm', dictionary=>'mycustomdictionary');
사전 조회 오래됨
기본적으로 맞춤법 사전 항목은 최대 비활성 15초로 읽습니다. 이렇게 하면 약간의 비활성이 있는 데이터를 읽는 것이 최신 데이터를 읽는 것보다 더 효율적이므로 읽기 작업의 오버헤드가 줄어듭니다. 따라서 사전 항목의 변경사항이 검색어에 반영되는 데 최대 15초가 걸릴 수 있습니다. 다음과 같은 방법으로 이 동작을 재정의할 수 있습니다.
fulltext_dictionary_staleness표 옵션 사용- 더 세부적인 제어를 위해
fulltext_dictionary_staleness쿼리 힌트 사용
쿼리 힌트와 테이블 옵션이 모두 사용되면 쿼리 힌트가 테이블 옵션을 재정의합니다.
fulltext_dictionary_staleness 표 옵션
사전 테이블에 fulltext_dictionary_staleness 옵션을 설정할 수 있습니다. 이 사전 테이블을 사용하는 모든 쿼리는 쿼리 힌트에 의해 재정의되지 않는 한 이 비활성 값을 사용합니다.
GoogleSQL
다음 예는 fulltext_dictionary_staleness 옵션을 사용하여 테이블을 CREATE하는 방법을 보여줍니다.
CREATE TABLE MyCustomDictionary (
Key STRING(MAX) NOT NULL,
Value ARRAY<STRING(MAX)> NOT NULL,
) PRIMARY KEY(Key),
OPTIONS (
fulltext_dictionary_table = true,
fulltext_dictionary_staleness = '5s'
);
다음 예에서는 ALTER 테이블을 사용하여 fulltext_dictionary_staleness 옵션을 변경하거나 설정하는 방법을 보여줍니다.
ALTER TABLE MyCustomDictionary SET OPTIONS (
fulltext_dictionary_staleness = '60s'
);
PostgreSQL
다음 예는 fulltext_dictionary_staleness 옵션을 사용하여 테이블을 CREATE하는 방법을 보여줍니다.
-- Create with 5s staleness
CREATE TABLE mycustomdictionary (
key character varying NOT NULL,
value character varying[] NOT NULL,
PRIMARY KEY(key)
) WITH (
type = 'fulltext_dictionary',
fulltext_dictionary_staleness = '5s'
);
PostgreSQL 인터페이스는 fulltext_dictionary_staleness 옵션을 변경하거나 설정하기 위한 ALTER 테이블을 지원하지 않습니다.
fulltext_dictionary_staleness 쿼리 힌트
더 세부적으로 제어하려면 fulltext_dictionary_staleness 쿼리 힌트를 사용하여 개별 쿼리에 대해 다른 비활성 기간을 지정하면 됩니다. 이 힌트는 테이블 수준 설정을 재정의합니다.
다음 예에서는 힌트를 사용하여 비활성 상태가 0인 사전 테이블 조회를 실행합니다. 이렇게 하면 최신 사전 항목이 읽힙니다. 이 접근 방식은 최신 데이터를 읽는 것이 약간의 오래된 데이터를 허용하는 것보다 효율성이 떨어지므로 쿼리 지연 시간을 늘릴 수 있습니다.
GoogleSQL
@{fulltext_dictionary_staleness="0s"}
SELECT MessageId, Body
FROM Messages
WHERE SEARCH(Body_Tokens, 'Bill', dictionary=>'MyCustomDictionary');
PostgreSQL
/*@ fulltext_dictionary_staleness='0s' */
SELECT messageid, body
FROM messages
WHERE spanner.search(body_tokens, 'Bill', dictionary=>'mycustomdictionary');
맞춤 사전 테이블의 알려진 제한사항
- 맞춤 사전 테이블과 함께 Spanner 가져오기 및 내보내기를 사용하는 것은 제한적으로 지원됩니다.
- 맞춤 사전 테이블은 기본 스키마에서 만들어야 하며 이름이 지정된 스키마에서는 만들 수 없습니다.
- 맞춤 사전 테이블은 기본 검색 쿼리 언어만 지원합니다.
맞춤 사전을 향상된 쿼리와 결합
SEARCH 함수에서 dictionary와 enhance_query=>true을 모두 설정하여 맞춤 사전 동의어를 enhanced query와 결합할 수 있습니다. 쿼리 개선을 사용하면 일반적인 동의어나 맞춤법 수정으로 쿼리를 확장할 수 있으며, 맞춤 사전에서는 자체 확장을 정의할 수 있습니다. 예를 들어 enhance_query가 record를 포함하도록 album를 확장하고 MyCustomDictionary가 album를 ['vinyl', 'cassette']에 매핑하는 경우 다음 쿼리는 album, record, vinyl 또는 cassette를 포함하는 메시지와 일치합니다.
GoogleSQL
SELECT MessageId, Body
FROM Messages
WHERE SEARCH(Body_Tokens, 'album', enhance_query=>true, dictionary=>'MyCustomDictionary');
PostgreSQL
SELECT messageid, body
FROM messages
WHERE spanner.search(body_tokens, 'album', enhance_query=>true, dictionary=>'mycustomdictionary');
두 가지 개선사항이 모두 사용 설정된 경우 원래 검색어에 대해 독립적으로 작동하며 한 개선사항에서 생성된 검색어는 다른 개선사항의 입력으로 사용되지 않습니다.
다음 단계
- 퍼지 검색으로 근사치 일치 찾기에 대해 알아보세요.
- 검색 결과 순위 지정 방법 알아보기