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이 양식문서 문제를보고하려면