| 롤 토토 : 문서 : 9.5 : 롤 토토 | |||
|---|---|---|---|
| PostgreSQL : 문서 : 9.5 : 토토 | PostgreSQL : 문서 : 9.5 : 추가 제공 윈 토토 | 부록 F. 추가 제공 모듈 | PostgreSQL : 문서 : 9.5 : 토토 꽁 머니 |
그pg_trgm모듈은 트라이그램 일치를 기반으로 영숫자 텍스트의 유사성을 결정하는 함수와 연산자뿐만 아니라 유사한 문자열에 대한 빠른 검색을 지원하는 인덱스 연산자 클래스를 제공합니다.
트라이그램은 문자열에서 가져온 세 개의 연속 문자 그룹입니다. 두 문자열이 공유하는 트라이그램 수를 세어 두 문자열의 유사성을 측정할 수 있습니다. 이 간단한 아이디어는 많은 자연어에서 단어의 유사성을 측정하는 데 매우 효과적인 것으로 나타났습니다.
참고: pg_trgm문자열에서 트라이그램을 추출할 때 단어가 아닌 문자(영숫자가 아닌)를 무시합니다. 문자열에 포함된 트라이그램 세트를 결정할 때 각 단어에는 접두어 2개의 공백과 접미어 1개의 공백이 있는 것으로 간주됩니다. 예를 들어, 문자열의 트라이그램 세트"고양이"is" c", " ca", "고양이"및"에 ". 문자열의 트라이그램 세트"foo|바"is" f", " fo", "foo", "oo ", " b", " 바", "바"그리고"ar ".
에서 제공하는 기능pg_trgm모듈은 다음에 표시됩니다.표 F-25, 연산자는표 F-26.
표 F-25.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 스포츠 토토 결과에서는 구현될 수 없습니다. 소수의 가장 가까운 일치 항목만 원하는 경우 일반적으로 첫 번째 공식을 능가합니다.
시작PostgreSQL9.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의 상대적인 성능 특성에 따라 달라지며 이에 대해서는 다른 곳에서 논의됩니다. 경험상 GIN 스포츠 토토 결과는 GiST 스포츠 토토 결과보다 검색 속도가 빠르지만 구축이나 업데이트 속도가 느립니다. 따라서 GIN은 정적 데이터에 더 적합하고 GiST는 자주 업데이트되는 데이터에 더 적합합니다.
트라이그램 일치는 전체 텍스트 색인과 함께 사용될 때 매우 유용한 도구입니다. 특히 전체 텍스트 검색 메커니즘에서 직접 일치하지 않는 철자가 틀린 입력 단어를 인식하는 데 도움이 될 수 있습니다.
첫 번째 단계는 문서의 모든 고유 단어를 포함하는 보조 테이블을 생성하는 것입니다.
CREATE TABLE 단어 AS SELECT 단어 FROM
ts_stat('SELECT to_tsVector(''simple'', bodytext) FROM 문서');
어디에서문서텍스트 필드가 있는 테이블입니다.본문우리가 검색하고 싶은 것입니다. 를 사용하는 이유단순다음으로 구성to_ts벡터함수는 언어별 구성을 사용하는 대신 원래(어간 없는) 단어 목록을 원한다는 것입니다.
다음으로, 단어 열에 트라이그램 인덱스를 생성하십시오:
GIN을 사용하여 단어에 word_idx 인덱스 생성(단어 gin_trgm_ops);
이제, 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.의 후원을 받습니다.