F.33. PG_TRGM - Trigram 매칭을 사용한 텍스트의 토토 지원#

PG_TRGM모듈은 트리 그램 매칭을 기반으로 영숫자 텍스트의 토토을 결정하기위한 기능과 연산자뿐만 아니라 유사한 문자열을 빠르게 검색하는 인덱스 연산자 클래스를 제공합니다.

이 모듈이 고려됩니다신뢰할 수있는Create현재 데이터베이스의 권한.

F.33.1. Trigram (또는 Trigraph) 개념#

Trigram은 문자열에서 가져온 3 개의 연속 문자 그룹입니다. 우리는 그들이 공유하는 트리 그램의 수를 계산하여 두 줄의 토토을 측정 할 수 있습니다.

note

PG_TRGM문자열에서 트리 그램을 추출 할 때는 비 단어 문자 (비 알파늄)가 무시됩니다. 각 단어는 문자열에 포함 된 트리 그램 세트를 결정할 때 두 개의 공간이 접두사가 있고 하나의 공간이 접미사되는 것으로 간주됩니다.catisc, CA, catat. 문자열의 트리 그램 세트foo | barisf, fo, foo, oo, b, BA, barar.

F.33.2. 기능 및 운영자#

PG_TRGM모듈에 표시됩니다테이블 F.25, 연산자테이블 F.26.

표 F.25. PG_TRGM기능

기능

설명

토토 ( 텍스트, 텍스트) →Real

두 인수가 얼마나 유사한지를 나타내는 숫자를 반환합니다. 결과의 범위는 0입니다 (두 줄이 완전히 다르지 않음).

show_trgm ( 텍스트) →텍스트 []

지정된 문자열에 모든 트리 그램의 배열을 반환합니다. (실제로 이것은 디버깅을 제외하고는 거의 유용하지 않습니다.)

Word_Similarity ( 텍스트, 텍스트) →Real

첫 번째 문자열의 트리 그램 세트와 두 번째 문자열의 순서대로 트리 그램 세트의 연속 범위 사이의 가장 큰 토토을 나타내는 숫자를 반환합니다. 자세한 내용은 아래 설명을 참조하십시오.

strict_word_similarity ( 텍스트, 텍스트) →Real

동일Word_Similarity, 그러나 단어 경계와 일치하는 경계 범위. 우리는 교차 단어 트리 그램이 없기 때문에이 함수는 실제로 첫 번째 문자열과 두 번째 문자열의 연속적인 범위 사이에서 가장 큰 토토을 반환합니다.

show_limit() →Real

|%연산자. 이것은 예를 들어 두 단어 사이의 최소 토토을 예를 들어 서로의 철자가 될 정도로 유사하게 간주됩니다.감가 상각; 대신 사용show pg_trgm.similarity_threshold.)

set_limit ( Real) →Real

|%운영자. 임계 값은 0과 1 사이 여야합니다 (기본값은 0.3).감가 상각; 대신 사용SET pg_trgm.similarity_threshold.)


다음 예를 고려하십시오 :

# word_similarity ( 'Word', 'Two Word');

첫 번째 문자열에서 트리 그램 세트는입니다."w", "wo", "wor", "ord", "rd". 두 번째 문자열에서는 순서대로 트리 그램 세트가입니다."t", "tw", "tw", "two", "wo", "w", "wo", "wo", "ord", "rds", "ds". 두 번째 문자열에서 주문한 트리 그램 세트의 가장 유사한 범위는입니다."w", "wo", "wor", "ord", 토토은0.8.

이 함수는 첫 번째 문자열과 두 번째 문자열의 모든 하위 문자열 사이의 가장 큰 토토으로 거의 이해 될 수있는 값을 반환합니다. 그러나이 함수는 범위의 경계에 패딩을 추가하지 않습니다.

동시에strict_word_similarity두 번째 문자열에서 단어 범위를 선택합니다. 위의 예에서strict_word_similarity단일 단어의 범위를 선택합니다'단어'"w", "wo", "wor", "ord", "rds", "ds".

# 유사 ( '단어', '두 단어'), 토토 ( 'Word', 'Word');

따라서strict_word_similarity함수는 전체 단어와 토토을 찾는 데 유용합니다.Word_Similarity단어의 일부와 토토을 찾는 데 더 적합합니다.

표 F.26. PG_TRGM운영자

운영자

설명

텍스트 % 텍스트부울

반환true인수가 현재 유사한 임계 값보다 큰 토토을 갖는 경우pg_trgm.similarity_threshold.

텍스트 <% 텍스트부울

반환true첫 번째 인수에 설정된 트리 그램 사이의 토토과 두 번째 인수에서 설정된 순서 트리 그램의 연속 정도가 현재 단어 토토 임계 값보다pg_trgm.word_similarity_threshold매개 변수.

텍스트 %> 텍스트부울

<%운영자.

텍스트 <<% 텍스트부울

반환true두 번째 인수가 단어 경계와 일치하는 순서 대 한 트리 그램 세트의 연속적인 범위를 갖는 경우, 첫 번째 인수의 트리 그램 세트와의 토토은 현재 엄격한 단어 토토 임계 값보다pg_trgm.Strict_word_similarity_threshold매개 변수.

텍스트 %>> 텍스트부울

<<%운영자.

텍스트 <--> 텍스트Real

반환거리인수들 사이에서, 그것은 하나의 뺀입니다.토토 ()value.

텍스트 <<-> 텍스트Real

반환거리인수들 사이에서, 그것은 하나의 뺀입니다.Word_Similarity ()value.

텍스트 <->> 텍스트Real

<<->운영자.

텍스트 <<<-> 텍스트Real

반환거리인수들 사이에서, 그것은 하나의 뺀입니다.strict_word_similarity ()value.

텍스트 <->>> 텍스트Real

<<<->운영자.


F.33.3. GUC 매개 변수#

pg_trgm.similarity_threshold (Real) #

|%운영자. 임계 값은 0과 1 사이 여야합니다 (기본값은 0.3).

pg_trgm.word_similarity_threshold (Real) #

현재 Word 토토 임계 값을 설정합니다.<%and%>연산자. 임계 값은 0과 1 사이 여야합니다 (기본값은 0.6).

pg_trgm.Strict_word_similarity_threshold (Real) #

현재 엄격한 단어 토토 임계 값을 설정합니다.<<%and%>>운영자. 임계 값은 0과 1 사이 여야합니다 (기본값은 0.5).

F.33.4. 인덱스 지원#

PG_TRGM모듈은 매우 빠른 토토 검색을 목적으로 텍스트 열을 통해 인덱스를 생성 할 수있는 GIST 및 GIN 인덱스 작업자 클래스를 제공합니다. 이 인덱스 유형은 위에서 설명한 토토 연산자를 지원하며 추가로 트리 그램 기반 인덱스 검색을 지원합니다.Like, ilike, ~, ~*and=쿼리. 토토 비교는 기본 빌드에서에서 사례에 민감합니다.PG_TRGM. 불평등 운영자는 지원되지 않습니다.

예 :

테이블 생성 test_trgm (t text);

또는

gin (t gin_trgm_ops)을 사용하여 test_trgm에서 인덱스 trgm_idx 생성;

gist_trgm_opsGist Opclass는 비트 맵 서명으로 트리 그램 세트를 근사합니다. 선택적 정수 매개 변수Siglen시그니처 길이를 바이트로 결정합니다. 기본 길이는 12 바이트입니다.

서명 길이 32 바이트를 가진 인덱스 생성 예 :

GIST를 사용하여 test_trgm에서 인덱스 trgm_idx 생성 (t gist_trgm_ops (siglen = 32));

이 시점에서에 대한 색인이 있습니다.t토토 검색에 사용할 수있는 열. 일반적인 쿼리는입니다.

선택 t, 토토 (t, 'Word') sml로Word'

이것은 텍스트 열의 모든 값을 충분히 유사하게 반환합니다Word, Best Match에서 최악으로 정렬되었습니다. 인덱스는 매우 큰 데이터 세트에서도 빠른 작업을하는 데 사용됩니다.

위의 쿼리의 변형은입니다.

select t, t <--> 'Word' Dist

이것은 GIST 인덱스에 의해 상당히 효율적으로 구현 될 수 있지만 GIN 인덱스는 아닙니다. 가장 가까운 경기가 원한다면 일반적으로 첫 번째 공식을 이길 것입니다.

또한에서 색인을 사용할 수 있습니다t단어 토토 또는 엄격한 단어 토토에 대한 열. 일반적인 쿼리는 다음과 같습니다.

select t, word_similarity ( 'Word', t) smlWord' <% t

and

select t, strict_word_similarity ( 'Word', t) smlWord' <<% t

Trigram 세트와 충분히 유사한 해당 순서 트리 그램 세트에 연속적인 범위가있는 텍스트 열의 모든 값을 반환합니다.Word, Best Match에서 최악으로 정렬되었습니다. 인덱스는 매우 큰 데이터 세트에서도 빠른 작업을하는 데 사용됩니다.

위의 쿼리의 가능한 변형은 다음과 같습니다.

select t, 'Word' <<-> t Dist

and

select t, 'Word' <<<-> t Dist

이것은 GIST 인덱스에 의해 상당히 효율적으로 구현 될 수 있지만 GIN 인덱스는 아닙니다.

시작PostgreSQL9.1,이 인덱스 유형은 인덱스 검색을 지원합니다Likeandilike, 예를 들어

선택 *에서 test_trgm에서 t where '%foo%bar';

인덱스 검색은 검색 문자열에서 트리 그램을 추출한 다음 인덱스에서 이들을 찾아 작동합니다. 검색 문자열에서 트리 그램이 많을수록 인덱스 검색이 더 효과적입니다.

시작PostgreSQL9.3,이 인덱스 유형은 또한 일반 표현 일치에 대한 인덱스 검색을 지원합니다 (~and~*연산자), 예를 들어

선택 *에서 test_trgm에서 t ~ '(foo | bar)';

인덱스 검색은 정규 표현식에서 트리 그램을 추출한 다음 색인에서 이들을 찾아서 작동합니다. 정규 표현식에서 추출 할 수있는 트리 그램이 많을수록 인덱스 검색이 더 효과적입니다.

두 가지 모두Like및 일반 표현력 검색, 추출 가능한 트리그램이없는 패턴은 전체 인덱스 스캔으로 퇴화한다는 점을 명심하십시오.

GIST와 GIN 인덱싱 사이의 선택은 GIST와 GIN의 상대적 성능 특성에 따라 다릅니다.

F.33.6. 참조#

GIST 개발 사이트is

Tsearch2 개발 사이트is

F.33.7. 저자#

Oleg Bartunov, 러시아 모스크바 대학교 모스크바

Teodor Sigaev, Moscow, Delta-Soft Ltd., 러시아

Alexander Korotkov, 모스크바, Postgres Professional, Russia

문서 : Christopher Kings-Lynne

이 모듈은 러시아 모스크바에있는 Delta-Soft Ltd.가 후원합니다.

정정 제출

34961_35155이 양식문서 문제를보고하려면