그pg_trgm모듈은 트라이그램 일치를 기반으로 영숫자 텍스트의 유사성을 결정하는 함수와 연산자는 물론 유사한 문자열에 대한 빠른 검색을 지원하는 인덱스 연산자 클래스를 제공합니다.
트라이그램은 문자열에서 가져온 세 개의 연속 문자 그룹입니다. 두 문자열이 공유하는 트라이그램 수를 세어 두 문자열의 와이즈 토토을 측정할 수 있습니다. 이 간단한 아이디어는 많은 자연어에서 단어의 와이즈 토토을 측정하는 데 매우 효과적인 것으로 나타났습니다.
pg_trgm문자열에서 트라이그램을 추출할 때 단어가 아닌 문자(영숫자가 아닌)를 무시합니다. 문자열에 포함된 트라이그램 세트를 결정할 때 각 단어에는 접두어 2개의 공백과 접미어 1개의 공백이 있는 것으로 간주됩니다. 예를 들어, 문자열의 트라이그램 세트“고양이”이다“ c”, “ ca”, “고양이”및“에 ”. 문자열의 트라이그램 세트“foo|바”이다“ f”, “ fo”, “foo”, “oo ”, “ b”, “ 바”, “바”및“ar ”.
다음에서 제공하는 기능pg_trgm모듈은 다음에 표시됩니다.표 F.25, 연산자표 F.26.
표 F.25. pg_trgm기능
다음 예를 고려해보세요:
# SELECT word_similarity('단어', '두 단어');
단어_유사성
-----------------
0.8
(1행)
첫 번째 문자열에서 트라이그램 세트는 다음과 같습니다." w"," wo","ord","wor","rd ". 두 번째 문자열에서 순서가 지정된 트라이그램 세트는 다음과 같습니다." t"," tw","two","wo"," w"," wo","wor","ord","rds","ds ". 두 번째 문자열에서 순서가 지정된 트라이그램 세트의 가장 유사한 범위는 다음과 같습니다." w"," wo","wor","ord", 유사점은0.8.
이 함수는 첫 번째 문자열과 두 번째 문자열의 하위 문자열 사이의 가장 큰 유사성으로 대략적으로 이해할 수 있는 값을 반환합니다. 그러나 이 함수는 범위 경계에 패딩을 추가하지 않습니다. 따라서 일치하지 않는 단어 경계를 제외하고 두 번째 문자열에 있는 추가 문자 수는 고려되지 않습니다.
표 F.26. pg_trgm연산자
| 운영자 | 반품 | 설명 |
|---|---|---|
텍스트 % 텍스트 |
부울 |
반품사실인수가 다음에 의해 설정된 현재 유사성 임계값보다 큰 유사성을 갖는 경우pg_trgm.similarity_threshold. |
텍스트 <% 텍스트 |
부울 |
반품참첫 번째 인수에 설정된 트라이그램과 두 번째 인수에 설정된 순서 트라이그램의 연속 범위 사이의 유사성이 다음에 의해 설정된 현재 단어 유사성 임계값보다 큰 경우pg_trgm.word_similarity_threshold매개변수. |
텍스트 % 텍스트 |
부울 |
의 정류자<%연산자. |
텍스트 <- 텍스트 |
진짜 |
반환“거리”인수 사이에서 1을 뺀 값입니다.와이즈 토토()값. |
텍스트 <<- 텍스트 |
진짜 |
다음을 반환합니다“거리”인수 사이, 즉 1 빼기word_similarity()값. |
텍스트 <- 텍스트 |
진짜 |
의 정류자<<-연산자. |
그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 인덱스에서는 구현될 수 없습니다. 소수의 가장 가까운 일치 항목만 원하는 경우 일반적으로 첫 번째 공식을 능가합니다.
또한 다음에서 색인을 사용할 수 있습니다.t단어 유사성에 대한 열입니다. 예를 들면:
SELECT t, word_similarity('단어', t) AS sml
test_trgm에서
어디 '단어' <% t
sml DESC로 주문, t;
이것은 트라이그램 세트와 충분히 유사한 해당 정렬 트라이그램 세트에 연속 범위가 있는 텍스트 열의 모든 값을 반환합니다.단어, 가장 일치하는 항목부터 가장 나쁜 항목까지 정렬됩니다. 인덱스는 매우 큰 데이터 세트에서도 이 작업을 빠르게 수행하는 데 사용됩니다.
위 쿼리의 변형은 다음과 같습니다.
선택 t, '단어' <<- t AS 거리
test_trgm에서
거리 제한 10으로 주문;
이것은 GiST 인덱스로 매우 효율적으로 구현될 수 있지만 GIN 인덱스로는 구현되지 않습니다.
시작PostgreSQL9.1, 이 색인 유형은 다음에 대한 색인 검색도 지원합니다.좋아요그리고좋아요, 예를 들어
SELECT * FROM test_trgm WHERE t LIKE '%foo%bar';
색인 검색은 검색 문자열에서 트라이그램을 추출한 다음 이를 색인에서 찾는 방식으로 작동합니다. 검색 문자열에 트라이그램이 많을수록 인덱스 검색이 더 효과적입니다. B-트리 기반 검색과 달리 검색 문자열은 왼쪽에 고정될 필요가 없습니다.
시작PostgreSQL9.3, 이러한 인덱스 유형은 정규식 일치에 대한 인덱스 검색도 지원합니다(~그리고~*연산자), 예를 들어
SELECT * FROM test_trgm WHERE t ~ '(foo|bar)';
색인 검색은 정규 표현식에서 트라이그램을 추출한 다음 이를 색인에서 찾는 방식으로 작동합니다. 정규식에서 추출할 수 있는 트라이그램이 많을수록 인덱스 검색이 더 효과적입니다. B-트리 기반 검색과 달리 검색 문자열은 왼쪽에 고정될 필요가 없습니다.
둘 모두를 위해좋아요및 정규식 검색의 경우 추출 가능한 트라이그램이 없는 패턴은 전체 인덱스 스캔으로 변질된다는 점을 명심하세요.
GiST와 GIN 인덱싱 간의 선택은 GiST와 GIN의 상대적인 성능 특성에 따라 달라지며 이에 대해서는 다른 곳에서 논의됩니다.
트라이그램 일치는 전체 텍스트 색인과 함께 사용될 때 매우 유용한 도구입니다. 특히 전체 텍스트 검색 메커니즘에서 직접 일치하지 않는 철자가 틀린 입력 단어를 인식하는 데 도움이 될 수 있습니다.
첫 번째 단계는 문서의 모든 고유 단어를 포함하는 보조 테이블을 생성하는 것입니다.
CREATE TABLE 단어 AS SELECT 단어 FROM
ts_stat('SELECT to_tsVector(''simple'', bodytext) FROM 문서');
어디에서문서텍스트 필드가 있는 테이블입니다본문우리가 검색하고 싶은 것입니다. 를 사용하는 이유간단한다음으로 구성to_tsVector함수는 언어별 구성을 사용하는 대신 원래(어간 없는) 단어 목록을 원한다는 것입니다.
다음으로, 단어 열에 트라이그램 인덱스를 생성하십시오:
GIN(단어 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., 러시아
알렉산더 코로트코프<a.korotkov@postgrespro.ru, 모스크바, Postgres Professional, 러시아
문서: 크리스토퍼 킹스-린
이 모듈은 러시아 모스크바에 있는 Delta-Soft Ltd.의 후원을 받습니다.