2025년 9월 25일:토토 커뮤니티 : 토토
이 문서는 지원되지 않는 윈 토토 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : F.33. PG_TRGM - Trigram 매칭을 사용한 텍스트의 범퍼카 토토 지원버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

F.30. pg_trgm

pg_trgm모듈은 다음을 제공합니다 유사성을 결정하기 위한 함수 및 연산자ASCII영숫자 텍스트 기반 트라이그램 매칭뿐만 아니라 인덱스 연산자 클래스에 대해서도 유사한 문자열에 대한 빠른 검색을 지원합니다.

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

트라이그램은 연속된 세 문자의 그룹입니다. 문자열에서. 두 문자열의 유사성을 다음과 같이 측정할 수 있습니다. 그들이 공유하는 트라이그램의 수를 세어보세요. 이 간단한 아이디어 유사성을 측정하는 데 매우 효과적인 것으로 나타났습니다. 많은 자연어로 된 단어.

참고:문자열은 두 개의 공백이 있는 것으로 간주됩니다. 세트를 결정할 때 접두사가 붙고 접미사가 하나 추가됩니다. 문자열에 포함된 트라이그램입니다. 예를 들어, 문자열의 트라이그램"고양이"is" c", " ca", "고양이""at ".

F.30.2. 함수 및 연산자

다음에서 제공하는 기능pg_trgm모듈은 다음에 표시됩니다.표 F-24, 연산자 안에표 F-25.

표 F-24.pg_trgm기능

기능 반품 설명
유사성(텍스트, 텍스트) 진짜 두 항목이 얼마나 유사한지를 나타내는 숫자를 반환합니다. 인수는. 결과의 범위는 0입니다. (두 문자열이 완전히 연결되었음을 나타냅니다. 유사하지 않음)을 1로(두 문자열이 동일함을 나타냄) 동일한).
show_trgm(텍스트) 텍스트[] 주어진 영역의 모든 트라이그램 배열을 반환합니다. 끈. (실제로 이것은 다음을 제외하고는 거의 유용하지 않습니다. 디버깅.)
show_limit() 진짜 다음에서 사용하는 현재 유사성 임계값을 반환합니다. 그만큼%연산자. 이는 다음을 설정합니다. 두 단어 사이의 최소 유사성은 각각의 철자가 틀릴 정도로 유사한 것으로 간주됩니다. 예를 들어 기타.
set_limit(실제) 진짜 현재 사용되는 유사성 임계값을 설정합니다. 에 의해%연산자. 그만큼 임계값은 0과 1 사이여야 합니다(기본값은 0.3). 전달된 동일한 값을 반환합니다.

표 F-25.pg_trgm연산자

운영자 반품 설명
텍스트 % 텍스트 부울 반품사실그렇다면 주장은 그 주장보다 더 큰 유사성을 가지고 있습니다. 현재 유사성 임계값은에 의해 설정됩니다.set_limit.
텍스트 <- 텍스트 실제 다음을 반환합니다."거리"인수 사이에서 1을 뺀 값입니다.유사성()값.

F.30.3. 인덱스 지원

pg_trgm모듈은 GiST를 제공합니다 및 GIN 인덱스 연산자 클래스를 생성할 수 있습니다. 매우 빠른 작업을 위해 텍스트 열에 대한 색인을 생성합니다. 유사성 검색. 이러한 인덱스 유형은 다음을 지원합니다. 위에서 설명한 유사성 연산자 및 추가 지원 트라이그램 기반 인덱스 검색:좋아요그리고좋아요쿼리. (이 인덱스는 같음이나 단순 비교 연산자를 지원하지 않으므로 일반 B-트리 인덱스도 필요할 수 있습니다.)

예:

CREATE TABLE test_trgm (t 텍스트);
gist를 사용하여 test_trgm에서 trgm_idx 인덱스 생성(t gist_trgm_ops);

또는

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

이 시점에서 당신은 다음에 대한 색인을 갖게 될 것입니다.t유사성을 위해 사용할 수 있는 열 수색. 일반적인 쿼리는 다음과 같습니다.

SELECT t, 유사성(t, '단어') AS sml
  test_trgm에서
  어디에서 % '단어'
  sml DESC로 주문, t;

이것은 텍스트 열의 모든 값을 반환합니다. 충분히 유사단어, 가장 잘 일치하는 것부터 가장 나쁜 것까지 정렬되었습니다. 인덱스는 다음을 수행하는 데 사용됩니다. 이는 매우 큰 데이터 세트에서도 빠른 작업입니다.

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

SELECT t, t <- '단어' AS 거리
  test_trgm에서
  거리 제한 10으로 주문;

이것은 GiST 색인으로 매우 효율적으로 구현될 수 있습니다. 그러나 GIN 인덱스로는 그렇지 않습니다. 일반적으로 첫 번째를 이길 것입니다 소수의 가장 가까운 일치 항목만 있을 때 공식화 원했습니다.

시작윈 토토9.1, 이러한 색인 유형은 다음에 대한 색인 검색도 지원합니다.좋아요그리고좋아요, 예를 들어

SELECT * FROM test_trgm WHERE t LIKE '%foo%bar';

색인 검색은 다음에서 트라이그램을 추출하여 작동합니다. 문자열을 검색한 다음 색인에서 검색합니다. 더 검색 문자열에 트라이그램이 있을수록 색인이 더 효과적입니다. 검색은. B-트리 기반 검색과 달리 검색 문자열은 다음과 같습니다. 왼쪽에 고정되지 마십시오.

GiST와 GIN 인덱싱 사이의 선택은 다음에 따라 다릅니다. GiST와 GIN의 상대적인 성능 특성은 다음과 같습니다. 다른 곳에서 논의되었습니다. 경험상 GIN 지수가 더 빠릅니다. GiST 인덱스보다 검색하지만 구축 또는 업데이트 속도가 느립니다. 그래서 GIN은 정적 데이터에 더 적합하고 GiST는 자주 업데이트되는 데이터에 더 적합합니다. 데이터.

F.30.4. 텍스트 검색 통합

트라이그램 매칭은 다음에서 사용될 때 매우 유용한 도구입니다. 전체 텍스트 색인과 결합됩니다. 특히 도움이 될 수 있습니다 일치하지 않는 철자가 틀린 입력 단어를 인식합니다. 전체 텍스트 검색 메커니즘을 통해 직접적으로.

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

CREATE TABLE 단어 AS SELECT 단어 FROM
        ts_stat('SELECT to_tsVector(''simple'', bodytext) FROM 문서');

어디에서문서테이블은 다음과 같습니다 텍스트 필드가 있습니다.본문우리는 윈 토토을 원합니다. 를 사용하는 이유간단한다음으로 구성to_ts벡터함수를 사용하는 대신 언어별 구성에서는 다음 목록을 원한다는 것입니다. 원래(어간 없는) 단어.

다음으로, 단어 열에 트라이그램 인덱스를 생성하십시오:

gin(word gin_trgm_ops)을 사용하여 단어에 word_idx 인덱스 생성;

이제, a선택다음과 유사한 쿼리 이전 예를 사용하여 철자를 제안할 수 있습니다. 사용자 검색어에 철자가 틀린 단어. 유용한 추가 테스트는 다음과 같습니다. 선택한 단어의 길이도 비슷하도록 요구 철자가 틀린 단어에.

참고:이후단어테이블이 별도의 정적 테이블로 생성되었습니다. 남아 있도록 주기적으로 재생성해야 합니다. 문서 수집과 관련하여 합리적으로 최신 상태입니다. 유지 정확히 최신 정보는 일반적으로 불필요합니다.

F.30.6. 저자

올렉 바르투노프, 모스크바, 모스크바 대학교, 러시아

테오도르 시가예프, 모스크바, Delta-Soft Ltd., 러시아

문서: 크리스토퍼 킹스-린

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