그pg_trgm모듈은 다음을 제공합니다 유사성을 결정하기 위한 함수 및 연산자ASCII영숫자 텍스트 기반 트라이그램 매칭뿐만 아니라 인덱스 연산자 클래스에 대해서도 유사한 문자열에 대한 빠른 검색을 지원합니다.
트라이그램은 연속된 세 문자의 그룹입니다. 문자열에서. 두 문자열의 유사성을 다음과 같이 측정할 수 있습니다. 그들이 공유하는 트라이그램의 수를 세어보세요. 이 간단한 아이디어 유사성을 측정하는 데 매우 효과적인 것으로 나타났습니다. 많은 자연어로 된 단어.
참고:문자열은 두 개의 공백이 있는 것으로 간주됩니다. 세트를 결정할 때 접두사가 붙고 접미사가 하나 추가됩니다. 문자열에 포함된 트라이그램입니다. 예를 들어, 문자열의 트라이그램"고양이"is" c", " ca", "고양이"및"at ".
다음에서 제공하는 기능pg_trgm모듈은 다음에 표시됩니다.표 F-24, 연산자 안에표 F-25.
표 F-24.pg_trgm기능
| 기능 | 반품 | 설명 | 
|---|---|---|
유사성(텍스트,
            텍스트) | 
            진짜 | 두 항목이 얼마나 유사한지를 나타내는 숫자를 반환합니다. 인수는. 결과의 범위는 0입니다. (두 문자열이 완전히 연결되었음을 나타냅니다. 유사하지 않음)을 1로(두 문자열이 동일함을 나타냄) 동일한). | 
show_trgm(텍스트) | 
            텍스트[] | 주어진 영역의 모든 트라이그램 배열을 반환합니다. 끈. (실제로 이것은 다음을 제외하고는 거의 유용하지 않습니다. 디버깅.) | 
show_limit() | 
            진짜 | 다음에서 사용하는 현재 유사성 임계값을 반환합니다. 그만큼%연산자. 이는 다음을 설정합니다. 두 단어 사이의 최소 유사성은 각각의 철자가 틀릴 정도로 유사한 것으로 간주됩니다. 예를 들어 기타. | 
set_limit(실제) | 
            진짜 | 현재 사용되는 유사성 임계값을 설정합니다. 에 의해%연산자. 그만큼 임계값은 0과 1 사이여야 합니다(기본값은 0.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는 자주 업데이트되는 데이터에 더 적합합니다. 데이터.
트라이그램 매칭은 다음에서 사용될 때 매우 유용한 도구입니다. 전체 텍스트 색인과 결합됩니다. 특히 도움이 될 수 있습니다 일치하지 않는 철자가 틀린 입력 단어를 인식합니다. 전체 텍스트 검색 메커니즘을 통해 직접적으로.
첫 번째 단계는 다음을 포함하는 보조 테이블을 생성하는 것입니다. 문서의 모든 고유 단어:
CREATE TABLE 단어 AS SELECT 단어 FROM
        ts_stat('SELECT to_tsVector(''simple'', bodytext) FROM 문서');
    어디에서문서테이블은 다음과 같습니다
    텍스트 필드가 있습니다.본문우리는
    윈 토토을 원합니다. 를 사용하는 이유간단한다음으로 구성to_ts벡터함수를 사용하는 대신
    언어별 구성에서는 다음 목록을 원한다는 것입니다.
    원래(어간 없는) 단어.
다음으로, 단어 열에 트라이그램 인덱스를 생성하십시오:
gin(word gin_trgm_ops)을 사용하여 단어에 word_idx 인덱스 생성;
이제, a선택다음과 유사한 쿼리 이전 예를 사용하여 철자를 제안할 수 있습니다. 사용자 검색어에 철자가 틀린 단어. 유용한 추가 테스트는 다음과 같습니다. 선택한 단어의 길이도 비슷하도록 요구 철자가 틀린 단어에.
참고:이후단어테이블이 별도의 정적 테이블로 생성되었습니다. 남아 있도록 주기적으로 재생성해야 합니다. 문서 수집과 관련하여 합리적으로 최신 상태입니다. 유지 정확히 최신 정보는 일반적으로 불필요합니다.
GiST 개발 사이트http://www.sai.msu.su/~megera/postgres/gist/
Tsearch2 개발 사이트http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/
올렉 바르투노프<oleg@sai.msu.su,
    모스크바, 모스크바 대학교, 러시아
테오도르 시가예프<teodor@sigaev.ru,
    모스크바, Delta-Soft Ltd., 러시아
문서: 크리스토퍼 킹스-린
이 모듈은 모스크바의 Delta-Soft Ltd.가 후원합니다. 러시아 제국.
| 이전 | 홈 | PostgreSQL : 문서 : 9.2 : 사설 토토 | 
| pgstattuple | 위로 | 세그 |