F.35. pg_trgm

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

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

F.35.1. Trigram (또는 Trigraph) 개념

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

note

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

F.35.2. 기능 및 운영자

PG_TRGM모듈에 표시테이블 F.24, 연산자테이블 F.25.

표 F.24. PG_TRGM기능

function

설명

토토 사이트 ( 텍스트, 텍스트) →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", "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".

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

따라서strict_word_similarity함수는 전체 단어와 토토 사이트을 찾는 데 유용하지만Word_Similarity단어의 일부에 대한 토토 사이트을 찾는 데 더 적합합니다.

표 F.25. 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.35.3. GUC 매개 변수

pg_trgm.similarity_threshold (Real)

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

pg_trgm.word_similarity_threshold (Real)

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

pg_trgm.strict_word_similarity_threshold (Real)

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

F.35.4. 인덱스 지원

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

예 :

테이블 생성 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토토 사이트 검색에 사용할 수있는 열. 일반적인 쿼리는입니다.

select t, 토토 사이트 (t, 'Word') sml로Word'

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

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

선택 t, t <--> 'Word' Dist

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

F.35.5. 텍스트 검색 통합

Trigram 매칭은 전체 텍스트 인덱스와 함께 사용될 때 매우 유용한 도구입니다. 특히 전체 텍스트 검색 메커니즘에 의해 직접 일치하지 않는 철자가 틀린 입력 단어를 인식하는 데 도움이 될 수 있습니다.

첫 번째 단계는 문서에 모든 고유 한 단어가 포함 된 보조 테이블을 생성하는 것입니다.

선택한 단어로 테이블 단어를 작성하십시오

여기서문서텍스트 필드가있는 테이블BodyText우리가 검색하고자합니다. 사용 이유단순to_tsvector함수는 언어 별 구성을 사용하는 대신 원본 (예정되지 않은) 단어의 목록을 원한다는 것입니다..

다음, 단어 열에서 트리 그램 색인 생성 :

gin을 사용하여 단어에서 index words_idx 만들기 (Word gin_trgm_ops);

지금, aselect쿼리 이전 예제와 유사한 쿼리를 사용하여 사용자 검색 용어에서 철자가 잘못된 단어의 철자를 제안 할 수 있습니다. 유용한 추가 테스트는 선택된 단어가 철자가 잘못된 단어와도 길이가 비슷해야합니다.

note

이후단어테이블은 별도의 정적 테이블로 생성되었으므로 문서 수집과 합리적으로 최신 상태로 유지되도록 주기적으로 재생되어야합니다. 정확히 전류를 유지하는 것은 일반적으로 불필요합니다.

F.35.6. 참조

GIST 개발 사이트is

Tsearch2 개발 사이트is

F.35.7. 저자

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

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

Alexander Korotkov, 모스크바, Postgres Professional, 러시아

문서 : Christopher Kings-Lynne

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

정정 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다.이 양식문서 문제를보고하려면