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

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.26, 연산자테이블 F.27.

표 F.26. 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.)


다음 예를 고려하십시오 :

# select word_similarity ( 'Word', 'two Word');
 Word_similarity
------------------
             0.8
(1 행)

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

이 함수는 첫 번째 문자열과 두 번째 문자열의 모든 하위 문자열 사이의 가장 큰 토토 사이트으로 거의 이해 될 수있는 값을 반환합니다. 그러나이 함수는 범위의 경계에 패딩을 추가하지 않습니다. 따라서 두 번째 문자열에 존재하는 추가 문자의 수는 불일치 한 단어 경계를 제외하고는 고려되지 않습니다.

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

# strict_word_similarity ( '단어', '두 단어'), 토토 사이트 ( 'Word', 'Word');
 strict_word_similarity | 유사
----------------------+------------
               0.571429 |   0.571429
(1 행)

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

표 F.27. 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_SIMILORITY_THRESHOLD(Real) #

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

F.35.4. 인덱스 지원#

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

예 :

테이블 생성 test_trgm (t text);
GIST (t gist_trgm_ops)를 사용하여 test_trgm에서 인덱스 trgm_idx를 만듭니다.

또는

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

gist_trgm_opsGist Opclass는 비트 맵 서명으로 트리 그램 세트를 근사합니다. 선택적 정수 매개 변수Siglen시그니처 길이를 바이트로 결정합니다. 기본 길이는 12 바이트입니다. 서명 길이의 유효한 값은 1 내지 2024 바이트입니다. 서명이 길어 더 큰 인덱스 비용으로 더 정확한 검색 (인덱스의 작은 부분과 더 적은 힙 페이지를 스캔)으로 이어집니다.

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

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

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

선택 t, 토토 사이트 (t, 'Word') sml로
  test_trgm에서
  여기서 t % 'Word'
  sml desc, t; 주문

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

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

select t, t <-- 'Word' Dist
  test_trgm에서
  Dist Limit 10의 주문;

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

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

select t, word_similarity ( 'Word', t) sml
  test_trgm에서
  어디 'Word' <% t
  sml desc, t; 주문

and

select t, strict_word_similarity ( 'Word', t) sml
  test_trgm에서
  어디 'Word' <<% t
  sml desc, t; 주문

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

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

선택 t, 'Word' <<- t Dist
  test_trgm에서
  Dist Limit 10의 주문;

select t, 'Word' <<<- t Dist
  test_trgm에서
  Dist Limit 10의 주문;

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

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

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

인덱스 검색은 검색 문자열에서 트리 그램을 추출한 다음 인덱스에서 이들을 찾아 작동합니다. 검색 문자열에서 트리 그램이 많을수록 인덱스 검색이 더 효과적입니다. B- 트리 기반 검색과 달리 검색 문자열은 정리 할 필요가 없습니다.

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

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

인덱스 검색은 정규 표현식에서 트리 그램을 추출한 다음 색인에서 이들을 찾아서 작동합니다. 정규 표현식에서 추출 할 수있는 트리 그램이 많을수록 인덱스 검색이 더 효과적입니다. B- 트리 기반 검색과 달리 검색 문자열은 정리 할 필요가 없습니다.

두 가지 모두좋아요및 일반 표현력 검색은 추출 가능한 트리그램이없는 패턴이 전체 인덱스 스캔으로 퇴보 할 것임을 명심하십시오..

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

F.35.7. 저자#

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

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

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

문서 : Christopher Kings-Lynne

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

39203_39222

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면