그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","wor","ord","rd ". 두 번째 문자열에서 순서가 지정된 트라이그램 세트는 다음과 같습니다." t"," tw","two","wo"," w"," wo","wor","ord","rds","ds ". 두 번째 문자열에서 순서가 지정된 트라이그램 세트의 가장 유사한 범위는 다음과 같습니다."w","wo","wor","ord", 유사점은0.8.
이 함수는 첫 번째 문자열과 두 번째 문자열의 하위 문자열 사이의 가장 큰 스포츠 토토으로 대략적으로 이해할 수 있는 값을 반환합니다. 그러나 이 함수는 범위 경계에 패딩을 추가하지 않습니다. 따라서 일치하지 않는 단어 경계를 제외하고 두 번째 문자열에 있는 추가 문자 수는 고려되지 않습니다.
동시에,strict_word_similarity두 번째 문자열에서 단어의 범위를 선택합니다. 위의 예에서는,strict_word_similarity한 단어의 범위를 선택합니다'단어', 그 트라이그램 세트는" w"," wo","wor","ord","rds","ds ".
# SELECT strict_word_similarity('단어', '두 단어'), 스포츠 토토('단어', '단어');
엄격한 단어_스포츠 토토 | 스포츠 토토
-----------+------------
0.571429 | 0.571429
(1행)
따라서,strict_word_similarity함수는 전체 단어와의 스포츠 토토을 찾는 데 유용하지만단어_스포츠 토토단어 부분의 스포츠 토토을 찾는 데 더 적합합니다.
표 F.26. pg_trgm운영자
|
운영자 설명 |
|---|
|
반품 |
|
반품 |
|
정류자 |
|
반품 |
|
정류자 |
|
다음을 반환합니다“거리”인수 사이에서 1을 뺀 값입니다. |
|
반환“거리”인수 사이, 즉 1 빼기 |
|
정류자 |
|
다음을 반환합니다“거리”인수 사이, 즉 1 빼기 |
|
정류자 |
pg_trgm.similarity_threshold (진짜) 다음에서 사용되는 현재 스포츠 토토 임계값을 설정합니다.%연산자. 임계값은 0과 1 사이여야 합니다(기본값은 0.3).
pg_trgm.word_similarity_threshold (진짜) 다음에서 사용되는 현재 단어 스포츠 토토 임계값을 설정합니다.<%그리고%연산자. 임계값은 0과 1 사이여야 합니다(기본값은 0.6).
pg_trgm.strict_word_similarity_threshold (실제) 다음에서 사용되는 현재 엄격한 단어 스포츠 토토 임계값을 설정합니다.<<%그리고%연산자. 임계값은 0과 1 사이여야 합니다(기본값은 0.5).
그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);
gist_trgm_opsGiST opclass는 트라이그램 세트를 비트맵 서명으로 근사합니다. 선택적 정수 매개변수시글렌서명 길이를 바이트 단위로 결정합니다. 기본 길이는 12바이트입니다. 유효한 서명 길이 값은 1~2024바이트입니다. 서명이 길수록 더 큰 인덱스를 사용하는 대신 더 정확한 검색이 가능합니다(인덱스의 더 작은 부분과 더 적은 힙 페이지 검색).
서명 길이가 32바이트인 인덱스를 생성하는 예:
GIST를 사용하여 test_trgm에서 trgm_idx 인덱스 생성(t gist_trgm_ops(siglen=32));
이 시점에서 당신은 다음에 대한 색인을 갖게 될 것입니다.t28701_28772
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;
그리고
SELECT t, strict_word_similarity('단어', t) AS sml
test_trgm에서
어디 '단어' <<%t
sml DESC로 주문, t;
이것은 트라이그램 세트와 충분히 유사한 해당 정렬 트라이그램 세트에 연속 범위가 있는 텍스트 열의 모든 값을 반환합니다.단어, 가장 일치하는 항목부터 가장 나쁜 항목까지 정렬됩니다. 인덱스는 매우 큰 데이터 세트에서도 이 작업을 빠르게 수행하는 데 사용됩니다.
위 쿼리의 가능한 변형은 다음과 같습니다:
선택 t, '단어' <<- t AS 거리
test_trgm에서
거리 제한 10으로 주문;
그리고
선택 t, '단어' <<<- t AS dist
test_trgm에서
거리 제한 10으로 주문;
이것은 GiST 색인으로 매우 효율적으로 구현될 수 있지만 GIN 색인으로는 구현될 수 없습니다.
시작포스트그레SQL9.1, 이 색인 유형은 다음에 대한 색인 검색도 지원합니다.좋아요그리고좋아요, 예를 들어
SELECT * FROM test_trgm WHERE t LIKE '%foo%bar';
색인 검색은 검색 문자열에서 트라이그램을 추출한 다음 이를 색인에서 찾는 방식으로 작동합니다. 검색 문자열에 트라이그램이 많을수록 인덱스 검색이 더 효과적입니다. B-트리 기반 검색과 달리 검색 문자열은 왼쪽에 고정될 필요가 없습니다.
시작포스트그레SQL9.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)을 사용하여 단어에 대한 INDEX 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.의 후원을 받습니다.
문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.