PG_TRGM
모듈은 트리 그램 매칭을 기반으로 영숫자 텍스트의 범퍼카 토토을 결정하기위한 기능과 연산자뿐만 아니라 유사한 문자열을 빠르게 검색하는 인덱스 연산자 클래스를 제공합니다.
이 모듈이 고려됩니다“신뢰할 수있는”Create
현재 데이터베이스의 권한.
Trigram은 문자열에서 가져온 3 개의 연속 문자 그룹입니다. 우리는 그들이 공유하는 트리 그램의 수를 계산하여 두 줄의 범퍼카 토토을 측정 할 수 있습니다.
PG_TRGM
문자열에서 트리 그램을 추출 할 때는 비 단어 문자 (비 알파늄)가 무시됩니다. 각 단어는 문자열에 포함 된 트리 그램 세트를 결정할 때 두 개의 공간이 접두사가 있고 하나의 공간이 접미사되는 것으로 간주됩니다.“cat
”is“ c
”, “ CA
”, “cat
”및“at
”. 문자열의 트리 그램 세트“foo | bar
”is“ f
”, “ fo
”, “foo
”, “oo
”, “ b
”, “ BA
”, “bar
”및“ar
”.
PG_TRGM
모듈에 표시됩니다테이블 F.25, 연산자테이블 F.26.
표 F.25. PG_TRGM
기능
다음 예를 고려하십시오 :
# word_similarity ( 'Word', 'Two Word');
첫 번째 문자열에서 트리 그램 세트는입니다."w", "wo", "wor", "ord", "rd"
. 두 번째 문자열에서는 순서대로 트리 그램 세트가입니다."t", "tw", "tw", "two", "wo", "w", "wo", "wo", "ord", "rds", "ds"
. 두 번째 문자열에서 주문한 트리 그램 세트의 가장 유사한 범위는입니다."w", "wo", "wor", "ord"
, 범퍼카 토토은0.8
.
이 함수는 첫 번째 문자열과 두 번째 문자열의 모든 하위 문자열 사이의 가장 큰 범퍼카 토토으로 거의 이해 될 수있는 값을 반환합니다. 그러나이 함수는 범위의 경계에 패딩을 추가하지 않습니다.
동시에strict_word_similarity
두 번째 문자열에서 단어 범위를 선택합니다. 위의 예에서strict_word_similarity
단일 단어의 범위를 선택합니다'단어'
"w", "wo", "wor", "ord", "rds", "ds"
.
# 유사 ( '단어', '두 단어'), 범퍼카 토토 ( 'Word', 'Word');
따라서strict_word_similarity
함수는 전체 단어와 범퍼카 토토을 찾는 데 유용합니다.Word_Similarity
단어의 일부와 범퍼카 토토을 찾는 데 더 적합합니다.
표 F.26. PG_TRGM
운영자
운영자 설명 |
---|
반환 |
반환 |
|
반환 |
|
반환“거리”인수들 사이에서, 그것은 하나의 뺀입니다. |
반환“거리”인수들 사이에서, 그것은 하나의 뺀입니다. |
|
반환“거리”인수들 사이에서, 그것은 하나의 뺀입니다. |
|
pg_trgm.similarity_threshold
(Real
) #|%
운영자. 임계 값은 0과 1 사이 여야합니다 (기본값은 0.3).
pg_trgm.word_similarity_threshold
(Real
) #현재 Word 범퍼카 토토 임계 값을 설정합니다.<%
and%>
연산자. 임계 값은 0과 1 사이 여야합니다 (기본값은 0.6).
pg_trgm.Strict_word_similarity_threshold
(Real
) #현재 엄격한 단어 범퍼카 토토 임계 값을 설정합니다.<<%
and%>>
운영자. 임계 값은 0과 1 사이 여야합니다 (기본값은 0.5).
PG_TRGM
모듈은 매우 빠른 범퍼카 토토 검색을 목적으로 텍스트 열을 통해 인덱스를 생성 할 수있는 GIST 및 GIN 인덱스 작업자 클래스를 제공합니다. 이 인덱스 유형은 위에서 설명한 범퍼카 토토 연산자를 지원하며 추가로 트리 그램 기반 인덱스 검색을 지원합니다.Like
, ilike
, ~
, ~*
and=
쿼리. 범퍼카 토토 비교는 기본 빌드에서에서 사례에 민감합니다.PG_TRGM
. 불평등 운영자는 지원되지 않습니다.
예 :
테이블 생성 test_trgm (t text);
또는
gin (t gin_trgm_ops)을 사용하여 test_trgm에서 인덱스 trgm_idx 생성;
gist_trgm_ops
Gist Opclass는 비트 맵 서명으로 트리 그램 세트를 근사합니다. 선택적 정수 매개 변수Siglen
시그니처 길이를 바이트로 결정합니다. 기본 길이는 12 바이트입니다.
서명 길이 32 바이트를 가진 인덱스 생성 예 :
GIST를 사용하여 test_trgm에서 인덱스 trgm_idx 생성 (t gist_trgm_ops (siglen = 32));
이 시점에서에 대한 색인이 있습니다.t
범퍼카 토토 검색에 사용할 수있는 열. 일반적인 쿼리는입니다.
선택 t, 범퍼카 토토 (t, 'Word
') sml로Word
'
이것은 텍스트 열의 모든 값을 충분히 유사하게 반환합니다Word
, Best Match에서 최악으로 정렬되었습니다. 인덱스는 매우 큰 데이터 세트에서도 빠른 작업을하는 데 사용됩니다.
위의 쿼리의 변형은입니다.
select t, t <--> 'Word
' Dist
이것은 GIST 인덱스에 의해 상당히 효율적으로 구현 될 수 있지만 GIN 인덱스는 아닙니다. 가장 가까운 경기가 원한다면 일반적으로 첫 번째 공식을 이길 것입니다.
또한에서 색인을 사용할 수 있습니다t
단어 범퍼카 토토 또는 엄격한 단어 범퍼카 토토에 대한 열. 일반적인 쿼리는 다음과 같습니다.
select t, word_similarity ( 'Word
', t) smlWord
' <% t
and
select t, strict_word_similarity ( 'Word
', t) smlWord
' <<% t
Trigram 세트와 충분히 유사한 해당 순서 트리 그램 세트에 연속적인 범위가있는 텍스트 열의 모든 값을 반환합니다.Word
, Best Match에서 최악으로 정렬되었습니다. 인덱스는 매우 큰 데이터 세트에서도 빠른 작업을하는 데 사용됩니다.
위의 쿼리의 가능한 변형은 다음과 같습니다.
select t, 'Word
' <<-> t Dist
and
select t, 'Word
' <<<-> t Dist
이것은 GIST 인덱스에 의해 상당히 효율적으로 구현 될 수 있지만 GIN 인덱스는 아닙니다.
시작PostgreSQL9.1,이 인덱스 유형은 인덱스 검색을 지원합니다Like
andilike
, 예를 들어
선택 *에서 test_trgm에서 t where '%foo%bar';
인덱스 검색은 검색 문자열에서 트리 그램을 추출한 다음 인덱스에서 이들을 찾아 작동합니다. 검색 문자열에서 트리 그램이 많을수록 인덱스 검색이 더 효과적입니다.
시작PostgreSQL9.3,이 인덱스 유형은 또한 일반 표현 일치에 대한 인덱스 검색을 지원합니다 (~
and~*
연산자), 예를 들어
선택 *에서 test_trgm에서 t ~ '(foo | bar)';
인덱스 검색은 정규 표현식에서 트리 그램을 추출한 다음 색인에서 이들을 찾아서 작동합니다. 정규 표현식에서 추출 할 수있는 트리 그램이 많을수록 인덱스 검색이 더 효과적입니다.
두 가지 모두Like
및 일반 표현력 검색, 추출 가능한 트리그램이없는 패턴은 전체 인덱스 스캔으로 퇴화한다는 점을 명심하십시오.
GIST와 GIN 인덱싱 사이의 선택은 GIST와 GIN의 상대적 성능 특성에 따라 다릅니다.
Trigram 매칭은 전문 지수와 함께 사용될 때 매우 유용한 도구입니다. 특히 전체 텍스트 검색 메커니즘에 의해 직접 일치하지 않는 철자가 틀린 입력 단어를 인식하는 데 도움이 될 수 있습니다.
첫 번째 단계는 문서에 모든 고유 한 단어가 포함 된 보조 테이블을 생성하는 것입니다.
선택한 단어로 테이블 단어를 작성하십시오
여기서문서
텍스트 필드가있는 테이블BodyText
우리는 검색하고자합니다. 사용 이유단순
to_tsvector
함수는 언어 별 구성을 사용하는 대신 원본 (지정되지 않은) 단어 목록을 원한다는 것입니다..
다음, 단어 열에서 트리 그램 색인 생성 :
GIN을 사용하여 Word (Word Gin_Trgm_ops)에서 index words_idx 만들기;
지금, aselect
쿼리 이전 예제와 유사한 쿼리는 사용자 검색 용어에서 철자가 잘못된 단어의 철자를 제안하는 데 사용될 수 있습니다. 유용한 추가 테스트는 선택된 단어가 철자가 잘못된 단어와도 길이가 비슷해야합니다.
이후단어
테이블은 별도의 정적 테이블로 생성되었으므로 문서 수집과 합리적으로 최신 상태로 유지되도록 정기적으로 재생되어야합니다. 정확히 전류를 유지하는 것은 일반적으로 불필요합니다.
Oleg Bartunov<oleg@sai.msu.su
, 러시아 모스크바 대학교 모스크바
Teodor Sigaev<reodor@sigaev.ru
, Moscow, Delta-Soft Ltd., 러시아
Alexander Korotkov<a.korotkov@postgrespro.ru
, 모스크바, Postgres Professional, Russia
문서 : Christopher Kings-Lynne
이 모듈은 러시아 모스크바에있는 Delta-Soft Ltd.가 후원합니다.
34961_35155이 양식문서 문제를보고하려면