이 모듈은 데이터 유형을 구현합니다토토
계층 적 트리와 같은 구조에 저장된 데이터의 레이블을 나타냅니다. 라벨 나무를 통해 검색을위한 광범위한 시설이 제공됩니다.
이 모듈이 고려됩니다“신뢰할 수있는”Create
현재 데이터베이스의 권한.
a레이블는 영숫자, 밑줄 및 하이픈의 순서입니다. 유효한 영숫자 문자 범위는 데이터베이스 로케일에 따라 다릅니다. 예를 들어, C Locale에서 캐릭터a-za-z0-9_-
허용됩니다. 레이블은 길이가 1000 자를 초과하지 않아야합니다.
예 :42
, personal_services
a레이블 경로예를 들어 도트로 분리 된 0 이상의 레이블의 시퀀스l1.l2.l3
, 계층 적 트리의 루트에서 특정 노드까지 경로를 나타냅니다. 레이블 경로의 길이는 65535 라벨을 초과 할 수 없습니다.
예 :토토.countries.europe.russia
the토토
모듈은 몇 가지 데이터 유형을 제공합니다.
토토
레이블 경로를 저장합니다.
LQuery
토토하는 일반 표현과 같은 패턴을 나타냅니다토토
값. 간단한 단어는 경로 내에서 해당 레이블과 토토합니다. 별 기호 (*
)는 0 개 이상의 레이블과 토토합니다. 이들은 도트와 결합하여 전체 레이블 경로와 토토 해야하는 패턴을 형성 할 수 있습니다. 예를 들어:
foo정확한 레이블 경로 토토foo
*.foo.*레이블이 포함 된 라벨 경로 토토foo
*.foo마지막 레이블이있는 라벨 경로 토토foo
별 기호와 간단한 단어가 모두 정량화되어 토토 할 수있는 레이블 수를 제한 할 수 있습니다.
*n
정확히 토토n
라벨*n
,적어도 토토n
라벨*n
,M
적어도 토토n
하지만M
라벨*,M
최대 토토M
라벨 -*0,m
n
,M
적어도 토토n
그러나M
발생foo
foo ,횟수 토토foo
, 제로 포함
명시적인 정량자가없는 경우 별 기호의 기본값은 여러 레이블과 토토하는 것입니다 (즉,,
) 비 스타일 항목의 기본값은 정확히 한 번 토토하는 동안 (즉,1
).
비 스타의 끝에 넣을 수있는 몇 가지 수정자가 있습니다LQuery
정확히 토토보다 토토하는 항목 :
@예를 들어 사례 비면적으로 토토합니다a@
매치a
* 예를 들어이 접두사와 라벨을 토토시킵니다foo*
매치foobar
%초기 밑줄이 구분 된 단어 토토
행동%
조금 복잡합니다. 전체 레이블이 아닌 단어와 토토하려고합니다. 예를 들어foo_bar%
매치foo_bar_baz
하지만foo_barbaz
. 와 결합 된 경우*
, 접두사 매칭은 각 단어에 개별적으로 적용됩니다 (예 :foo_bar%*
매치foo1_bar2_baz
하지만FOO1_BR2_BAZ
.
또한 분리 된 몇 가지 수정되지 않은 비 스타트 품목을 쓸 수 있습니다|
(또는) 해당 항목과 토토하려면!
(NOT) 비 스타 그룹이 시작될 때 대안과 토토하지 않는 레이블과 토토합니다. 수량자는 그룹의 끝에갑니다. 그것은 그룹 전체에 대한 몇 가지 토토를 의미합니다 (즉, 일부 레이블이 대안과 토토하거나 토토하지 않음)..
여기에 주석이 달린 예는LQuery
:
토토.*0,2 .Sport*@.! Football | Tennis 1,. Russ*| Spain 에이. 비. 기음. 디. 이자형.
이 쿼리는 다음과 같은 라벨 경로와 토토합니다.
레이블로 시작토토
그리고 다음은 이전에 0에서 두 개의 레이블이 있습니다
사례 감수성 접두사로 시작하는 레이블스포츠
그런 다음 하나 이상의 레이블이 있으며 그 중 어느 것도 토토하지 않습니다축구
NOR테니스
그런 다음로 시작하는 레이블로 끝납니다.Russ
또는 정확히 토토하는스페인
.
ltxtQuery
토토하는 전체 텍스트 검색 패턴을 나타냅니다토토
값.ltxtQuery
값은 단어가 포함되어 있으며 수정 자와 함께@
, *
, %
끝에; 수정자는와 동일한 의미를 갖습니다.LQuery
. 단어는와 결합 할 수 있습니다.&
(및),|
(또는),!
(아님) 및 괄호. 의 주요 차이점LQuery
ltxtQuery
레이블 경로에서의 위치와 상관없이 단어와 토토합니다.
여기 예입니다ltxtQuery
:
유럽 및 러시아*@ &! 교통
이것은 레이블을 포함하는 경로와 토토합니다유럽
로 시작하는 모든 레이블러시아
(사례에 민감하지 않음) 라벨을 포함하는 경로는 아닙니다교통
. 경로 내 에서이 단어의 위치는 중요하지 않습니다. 또한%
사용됩니다.이 단어는 위치에 관계없이 레이블 내의 밑줄 내에서 구분 된 단어와 토토 할 수 있습니다.
참고 :ltxtQuery
기호 사이에 공백을 허용하지만토토
andLQuery
do not.
Type토토
일반적인 비교 연산자가 있습니다=
, <
, <
, ,
<=
, =
. 비교는 트리 트래버스 순서대로 정렬되며 노드의 어린이는 레이블 텍스트로 정렬됩니다. 또한에 표시된 전문 운영자테이블 F.12토토 가능합니다.
표 F.12. 토토
운영자
운영자 설명 |
---|
오른쪽 (또는 평등)의 조상 인 논증이 남아 있습니다. |
오른쪽 (또는 평등)의 후손 인 왼쪽 논증입니다. |
do |
do |
do |
|
텍스트 변환 |
배열은 조상이 포함되어 있습니다 |
배열은의 후손이 포함되어 있습니다 |
배열이 모든 경로 토토가 포함되어 있습니까 |
do |
배열은 모든 경로 토토를 포함합니까 |
조상 인 첫 번째 배열 항목을 반환합니다. |
후손 인 첫 번째 배열 항목을 반환합니다 |
토토하는 첫 번째 배열 항목을 반환 |
토토하는 첫 번째 배열 항목을 반환 |
연산자<@
, @
, @
and~
아날로그^<@
, ^@
, ^@
, ^~
, 인덱스를 토토하지 않는 것을 제외하고는 동일합니다. 테스트 목적으로 만 유용합니다.
가용 함수는에 표시됩니다.표 F.13.
표 F.13. 토토
기능
토토
표시된 연산자 속도를 높일 수있는 여러 유형의 인덱스를 지원합니다.
B-Tree Index over토토
: <
, <=
, =
, =
,
해시 색인 오버토토
: =
Gist Index over토토
(gist_토토_ops
opclass) :<
, <=
, =
, =
, ,
@
, <@
, @
, ~
, ?
gist_토토_ops
Gist Opclass는 경로 레이블 세트를 비트 맵 서명으로 근사합니다. 선택적 정수 매개 변수Siglen
시그니처 길이를 바이트로 결정합니다. 기본 서명 길이는 8 바이트입니다. 길이는 긍정적 인 배수이어야합니다.int
정렬 (대부분의 기계에서 4 바이트)) 최대 2024. 더 긴 서명이 더 정확한 검색으로 이어집니다 (더 큰 인덱스 비용으로 더 적은 부분의 지수를 스캔하고 힙 페이지가 적음).
기본 서명 길이 8 바이트로 인덱스를 생성하는 예 :
GIST (PATH)를 토토하여 테스트에서 인덱스 PATH_GIST_IDX 생성;
서명 길이가 100 바이트 인 인덱스 생성 예 :
GIST를 토토하여 테스트시 인덱스 PATH_GIST_IDX 작성 (PATH GIST_LTREE_OPS (SIGLEN = 100));
Gist Index over토토 []
(gist__토토_ops
opclass) :토토 [] <@ 토토
, 토토 @ 토토 []
, @
, ~
, ?
gist__토토_ops
Gist Opclass는와 유사하게 작동합니다.gist_토토_ops
그리고 서명 길이를 매개 변수로 취합니다. 의 기본값Siglen
ingist__토토_ops
is 28 바이트입니다.
기본 서명 길이 28 바이트로 이러한 인덱스 생성 예 :
GIST (array_path)를 토토하여 테스트에서 인덱스 PATH_GIST_IDX 작성;
서명 길이가 100 바이트 인 인덱스 생성 예 :
GIST (array_path gist__토토_ops (siglen = 100));를 사용하여 테스트에서 인덱스 path_gist_idx 생성
참고 :이 인덱스 유형은 손실입니다.
이 예제는 다음 데이터를 사용합니다 (파일에서도 사용 가능Contrib/토토/토토test.sql
소스 분포에서) :
테이블 테스트 생성 (Path Ltree); 테스트 값에 삽입 ( '토토'); 테스트 값에 삽입 ( 'top.science'); 테스트 값에 삽입 ( 'top.science.astronomy'); 테스트 값에 삽입 ( 'top.science.astronomy.astrophysics'); 테스트 값에 삽입 ( 'top.science.astronomy.cosmology'); 테스트 값에 삽입 ( 'top.hobbies'); 테스트 값에 삽입 ( 'top.hobbies.amateurs_astronomy'); 테스트 값에 삽입 ( 'top.collections'); 테스트 값에 삽입 ( 'top.collections.pictures'); 테스트 값에 삽입 ( 'top.collections.pictures.astronomy'); 테스트 값에 삽입 ( 'top.collections.pictures.astronomy.stars'); 테스트 값에 삽입 ( 'top.collections.pictures.astronomy.galaxies'); 테스트 값에 삽입 ( 'top.collections.pictures.astronomy.astronauts'); GIST (PATH)를 사용하여 테스트시 인덱스 PATH_GIST_IDX를 만듭니다. btree (path)를 사용하여 테스트시 인덱스 path_idx를 만듭니다. HASH (PATH);을 사용하여 테스트시 인덱스 PATH_HASH_IDX 생성
이제 테이블이 있습니다테스트
아래에 표시된 계층 구조를 설명하는 데이터가 채워져 있습니다.
상단 / | \ 과학 취미 컬렉션 / | \ 천문학 Amateurs_토토 사진 / \ | 천체 물리학 우주론 천문학 / | \ 은하의 스타 우주 비행사
우리는 상속을 할 수 있습니다 :
토토test = 경로 <@ 'top.science'가있는 테스트에서 경로를 선택합니다. 길 --------------------------------------- 상위. 과학 Top.science.astronomy Top.science.astronomy.astrophysics top.science.astronomy.cosmology (4 줄)
경로 토토의 몇 가지 예는 다음과 같습니다.
토토test = 경로 ~ '*.astronomy.*'; 길 ------------------------------------------------------- Top.science.astronomy Top.science.astronomy.astrophysics top.science.astronomy.cosmology Top.collections.pictures.astronomy top.collections.pictures.astronomy.stars top.collections.pictures.astronomy.galaxies Top.Collections.pictures.astronomy.astronauts (7 줄) 토토test = 경로 ~ '*.! pictures@.astronomy.*'; 길 --------------------------------------- Top.science.astronomy Top.science.astronomy.astrophysics top.science.astronomy.cosmology (3 줄)
다음은 전체 텍스트 검색의 몇 가지 예입니다.
토토test = 경로 @ 'astro*% &! pictures @'; 길 --------------------------------------- Top.science.astronomy Top.science.astronomy.astrophysics top.science.astronomy.cosmology top.hobbies.amateurs_astronomy (4 줄) 토토test = path @ 'astro* &! pictures @'; 길 --------------------------------------- Top.science.astronomy Top.science.astronomy.astrophysics top.science.astronomy.cosmology (3 줄)
함수 토토 경로 구성 :
토토test = subpath (경로, 0,2) || '공간'|| subpath (path, 2)는 path <@ 'top.science.astronomy'; ?열? ----------------------------------------------- Top.science.space.astronomy top.science.space.astronomy.astrophysics top.science.space.astronomy.cosmology (3 줄)
경로에서 지정된 위치에 레이블을 삽입하는 SQL 함수를 만들어이를 단순화 할 수 있습니다.
함수 생성 INS_LABEL (토토, int, 텍스트)은 토토를 반환합니다 AS 'SELECT SUBPATH ($ 1,0, $ 2) || $ 3 || Subpath ($ 1, $ 2); ' 언어 SQL 불변; 토토test = select <@ 'top.science.astronomy'에서 테스트에서 ins_label (Path, 2, 'Space'); INS_LABEL ----------------------------------------------- Top.science.space.astronomy top.science.space.astronomy.astrophysics top.science.space.astronomy.cosmology (3 줄)
the토토_plpython3u
확장 도구토토
pl/python의 입력. 함수를 만들 때 설치 및 지정된 경우토토
값은 Python 목록에 매핑됩니다. (그러나 그 반대는 현재 지원되지 않습니다.)
변환 확장을 동일한 스키마에 설치하는 것이 좋습니다토토
. 그렇지 않으면 Transform Extension의 스키마에 적대적인 토토자가 정의한 개체가 포함 된 경우 설치 시간 보안 위험이 있습니다.
모든 작업은 Teodor Sigaev (에 의해 수행되었습니다.<teodor@stack.net
) 및 Oleg Bartunov (<oleg@sai.msu.su
). 보다http : //www.sai.msu.su/~megera/postgres/gist/추가 정보. 저자는 유용한 토론에 대해 Eugeny Rodichev에게 감사의 말씀을 전합니다. 의견과 버그 보고서를 환영합니다.
문서에 올바른 것이없는 것이 있으면 토토하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면