이 문서는 지원되지 않는 버전의 토토 꽁 머니을위한 것입니다.
당신은에 대해 같은 페이지를 보려고 할 수 있습니다PostgreSQL : 문서 : 17 : F.33. PG_TRGM - Trigram 매칭을 사용한 텍스트의 범퍼카 토토 지원버전 또는 위에 나열된 다른 지원되는 버전 중 하나입니다.

F.30. pg_trgm

thePG_TRGM모듈은 함수를 제공합니다 및 영숫자 텍스트의 유사성을 결정하기위한 연산자 Trigram 매칭 및 인덱스 운영자 클래스를 기반으로 비슷한 문자열을 빠르게 검색하는 지원.

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

Trigram은 3 개의 연속 문자 그룹입니다. 문자열. 계산하여 두 줄의 유사성을 측정 할 수 있습니다. 그들이 공유하는 트리 그램의 수. 이 간단한 아이디어는 그 것으로 밝혀졌습니다 많은 사람들의 단어의 유사성을 측정하는 데 매우 효과적입니다. 자연 언어.

참고 : PG_TRGM비 단어를 무시합니다 a에서 트리 그램을 추출 할 때 문자 (비 알파늄 성) 끈. 각 단어는 두 개의 공간이 접두사와 하나씩있는 것으로 간주됩니다. 공간에 포함 된 트리 그램 세트를 결정할 때 접미사 문자열. 예를 들어, 문자열의 트리 그램 세트"cat"is"C", "CA", "cat""at". 세트 문자열의 트리 그램"foo | bar"is"f", "fo", "foo", "oo", "B", "BA", "bar""ar".

F.30.2. 기능 및 운영자

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

표 F-24.PG_TRGM기능

기능 반환 설명
유사성 (텍스트, 텍스트) Real 두 인수가 얼마나 유사한지를 나타내는 숫자를 반환합니다. 이다. 결과 범위는 0입니다 (두 사람이 문자열은 완전히 다른 것입니다. 문자열은 동일합니다).
show_trgm (텍스트) 텍스트 [] 지정된 문자열에 모든 트리 그램의 배열을 반환합니다. (안에 연습은 디버깅을 제외하고는 거의 유용하지 않습니다.)
show_limit () Real 현재 유사한 임계 값을 반환합니다.%운영자. 이것은 사이의 최소 유사성을 설정합니다 그들에게 충분히 비슷한 것으로 간주 될 두 단어 예를 들어 서로의 철자가 있습니다.
set_limit (real) Real |%운영자. 임계 값은 사이에 있어야합니다 0 및 1 (기본값은 0.3). 통과 된 동일한 값을 반환합니다.

표 F-25.PG_TRGM운영자

운영자 반환 설명
텍스트 % 텍스트 부울 반환true인수가있는 경우 현재 유사성 임계 값보다 큰 유사성 설정set_limit.
텍스트 <-- 텍스트 Real 반환"거리"사이 논쟁, 그것은 하나의 뺀입니다.유사성 ()value.

F.30.3. 색인 지원하다

thePG_TRGM모듈은 요점을 제공합니다 인덱스를 통해 색인을 생성 할 수있는 진 인덱스 운영자 클래스 매우 빠른 유사성 검색을위한 텍스트 열. 이것들 인덱스 유형은 위에서 설명한 유사성 연산자를 지원합니다 또한 트리 그램 기반 인덱스 검색을 지원합니다좋아요, ilike, ~and~*쿼리. (이것들 인덱스는 평등이나 간단한 비교 연산자를 지원하지 않으므로 일반 B- 트리 색인도 필요할 수도 있습니다.)

예 :

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

또는

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

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

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

이것은 텍스트 열의 모든 값을 반환합니다. 충분히Word, 최고 일치에서 최악으로 정렬되었습니다. 인덱스는 만들기 위해 사용됩니다 이것은 매우 큰 데이터 세트에서도 빠른 작업입니다.

위의 쿼리의 변형은

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

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

시작토토 꽁 머니9.1, 이 인덱스 유형은에 대한 색인 검색도 지원합니다.좋아요andilike

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

토토 꽁 머니에서 트리 그램을 추출하여 인덱스 토토 꽁 머니이 작동합니다. 문자열과 인덱스에서 이것들을보고 있습니다. 트리 그램이 많을수록 토토 꽁 머니 문자열은 인덱스 토토 꽁 머니이 더 효과적입니다. 같지 않은 b- 트리 기반 토토 꽁 머니, 토토 꽁 머니 문자열은 필요하지 않습니다 좌익.

시작토토 꽁 머니9.3, 이 인덱스 유형은 또한 인덱스 검색을 지원합니다 일반 표현식 일치 (~~*연산자), 예를 들어

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

인덱스 토토 꽁 머니은 일반에서 트리 그램을 추출하여 작동합니다. 표현식과 색인에서 이것들을 바라보십시오. 더 정규 표현에서 추출 할 수있는 트리 그램, 인덱스 토토 꽁 머니이 더 효과적입니다. B- 트리 기반 토토 꽁 머니과 달리 토토 꽁 머니 문자열은 왼쪽 고정 할 필요가 없습니다.

두 가지 모두Like및 일반 표현 토토 꽁 머니, 추출 가능한 트리그램이없는 패턴을 명심하십시오. 전체 인덱스 스캔으로 변성됩니다.

GIST와 GIN 인덱싱 사이의 선택은 상대에 따라 다릅니다. 논의 된 GIST 및 GIN의 성능 특성 다른 곳. 경험상, 진 지수는 검색이 더 빠릅니다. 요지 지수이지만 구축 또는 업데이트가 느리게 진행됩니다. 그래서 진이 낫습니다 정적 데이터 및 종종 업데이트 된 데이터에 대한 GIST에 적합합니다.

F.30.4. 텍스트 검색 통합

Trigram 매칭은 함께 사용될 때 매우 유용한 도구입니다. 전체 텍스트 색인으로. 특히 인식하는 데 도움이 될 수 있습니다 직접 일치하지 않을 입력 단어가 전문 검색 메커니즘.

첫 번째 단계는 모든 것을 포함하는 보조 테이블을 생성하는 것입니다. 문서의 독특한 단어 :

선택한 단어로 테이블 단어를 작성하십시오
        ts_stat ( 'select to_tsvector (' 'simple' ', bodytext) 문서에서');

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

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

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

지금, aselect쿼리와 유사합니다 이전 예제는 철자 철자를 제안하는 데 사용될 수 있습니다. 사용자 검색 용어의 단어. 유용한 추가 테스트는이를 요구하는 것입니다 선택된 단어는 철자와 비슷한 길이입니다. 단어.

참고 :이후단어테이블 별도의 정적 테이블로 생성되었으므로 주기적으로 재생되어 합리적으로 최신 상태로 유지됩니다 문서 컬렉션과 함께. 정확히 전류를 유지하는 것은 일반적으로입니다 불필요한.

F.30.6. 저자

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

Teodor Sigaev, 모스크바, Delta-Soft Ltd., 러시아

문서 : Christopher Kings-Lynne

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