이 모듈은 데이터 유형을 구현합니다.트리계층적 트리 구조에 저장된 데이터의 레이블을 표시하기 위한 것입니다. 라벨 트리를 검색할 수 있는 광범위한 기능이 제공됩니다.
이 모듈은 고려됩니다.“신뢰할 수 있는”, 즉, 슈퍼유저가 아닌 토토자가 설치할 수 있습니다.만들기현재 데이터베이스에 대한 권한입니다.
A 라벨은 일련의 영숫자와 밑줄입니다(예: C 로케일의 문자A-Za-z0-9_허용됩니다). 라벨은 256자(영문 기준) 미만이어야 합니다.
예:42, 개인_서비스
A 라벨 경로은 점으로 구분된 0개 이상의 라벨 시퀀스입니다. 예를 들어L1.L2.L3, 계층 트리의 루트에서 특정 노드까지의 경로를 나타냅니다. 라벨 경로의 길이는 65535개의 라벨을 초과할 수 없습니다.
예:상위.국가.유럽.러시아
그트리모듈은 여러 데이터 유형을 제공합니다.
트리라벨 경로를 저장합니다.
쿼리일치에 대한 정규식과 유사한 패턴을 나타냅니다.트리값. 간단한 단어는 경로 내의 해당 레이블과 일치합니다. 별 기호(*)는 0개 이상의 라벨과 일치합니다. 이는 점으로 결합되어 전체 라벨 경로와 일치해야 하는 패턴을 형성할 수 있습니다. 예를 들면:
foo정확한 라벨 경로 일치foo*.foo.*라벨이 포함된 라벨 경로와 일치foo*.foo마지막 라벨이 다음과 같은 라벨 경로와 일치합니다.foo
별표 기호와 간단한 단어 모두 수량화하여 일치할 수 있는 라벨 수를 제한할 수 있습니다.
*{n} 정확히 일치함n라벨
*{n,} 적어도 일치n라벨
*{n,m} 적어도 일치n그러나 그 이하m라벨
*{,m} 최대 일치m라벨 — 동일*{0,mn,m} 적어도 일치n그러나 그 이상은 안 됨m발생 횟수foofoo,다음 항목의 개수와 일치foo, 0 포함
명시적인 수량자가 없는 경우 별 기호의 기본값은 원하는 수의 레이블과 일치하는 것입니다(즉,{,}) 별표가 아닌 항목의 기본값은 정확히 한 번만 일치하는 것입니다(즉,{1}).
별표가 아닌 문자 끝에 넣을 수 있는 여러 수식자가 있습니다.쿼리완전히 일치하는 것 이상으로 일치하도록 하는 항목:
@ 예를 들어 대소문자를 구분하지 않고 일치a@일치A* 예를 들어 이 접두사가 있는 라벨과 일치하십시오.foo*일치foobar% 초기 밑줄로 구분된 단어 일치
다음의 행동%조금 복잡합니다. 전체 레이블이 아닌 단어를 일치시키려고 합니다. 예를 들어foo_bar%일치foo_bar_baz하지만 아님foo_barbaz. 와 결합된 경우*, 접두사 일치는 각 단어에 개별적으로 적용됩니다. 예를 들어foo_bar%*일치foo1_bar2_baz하지만 아님foo1_br2_baz.
또한 수정 가능성이 있는 여러 개의 별표가 아닌 항목을 다음과 같이 구분하여 작성할 수 있습니다.|(또는) 해당 항목 중 하나와 일치하도록 하고 다음을 넣을 수 있습니다!(NOT)은 대안과 일치하지 않는 모든 레이블과 일치하는 별표가 아닌 그룹의 시작 부분에 있습니다. 수량자는 그룹의 끝에 옵니다. 이는 그룹 전체에 대한 일부 일치 항목 수(즉, 대안과 일치하거나 일치하지 않는 일부 라벨 수)를 의미합니다.
여기에 주석이 달린 예가 있습니다.쿼리:
톱.*0,2.sport*@.!football|테니스1,.Russ*|스페인 가. 비. 기음. 디. e.
이 쿼리는 다음과 같은 모든 라벨 경로와 일치합니다.
라벨로 시작함상위
다음에는 이전에 0~2개의 라벨이 있습니다.
대소문자를 구분하지 않는 접두사로 시작하는 라벨스포츠
다음에는 하나 이상의 라벨이 있으며 어느 것도 일치하지 않습니다.축구아니요테니스
다음으로 시작하는 라벨로 끝납니다.러스또는 정확히 일치함스페인.
ltxt쿼리일치에 대한 전체 텍스트 검색과 유사한 패턴을 나타냅니다.트리값. 안ltxt쿼리값에는 수식어가 있는 단어가 포함되어 있습니다.@, *, %끝에; 수식어는 에서와 동일한 의미를 갖습니다.쿼리. 단어는 다음과 결합될 수 있습니다.&(그리고),|(또는),!(NOT) 및 괄호. 의 주요 차이점쿼리그렇군요ltxt쿼리라벨 경로에서의 위치에 관계없이 단어를 일치시킵니다.
예는 다음과 같습니다.ltxt쿼리:
유럽 및 러시아*@ 및 !교통
이것은 라벨을 포함하는 경로와 일치합니다유럽및으로 시작하는 모든 라벨러시아(대소문자를 구분하지 않음), 그러나 라벨이 포함된 경로는 제외교통. 경로 내에서 이러한 단어의 위치는 중요하지 않습니다. 또한 언제%을 사용하면 해당 단어는 위치에 관계없이 라벨 내의 밑줄로 구분된 모든 단어와 일치할 수 있습니다.
참고:ltxt쿼리기호 사이에 공백을 허용하지만트리그리고쿼리하지 마세요.
유형트리일반적인 비교 연산자가 있음=, <, <, , <=, =. 비교는 트리 순회 순서로 정렬되며 노드의 하위 노드는 레이블 텍스트별로 정렬됩니다. 또한, 다음과 같은 전문 연산자를 사용합니다.표 F.13토토 가능합니다.
표 F.13. 트리운영자
|
운영자 설명 |
|---|
|
왼쪽 인수는 오른쪽(또는 동등)의 조상입니까? |
|
왼쪽 인수는 오른쪽(또는 같음)의 자손입니까? |
|
그렇습니다 |
|
그렇습니다 |
|
그렇습니다 |
|
연결 |
|
텍스트를 다음으로 변환합니다. |
|
배열에 다음의 조상이 포함되어 있습니까? |
|
배열에 다음의 하위 항목이 포함되어 있습니까? |
|
배열에 일치하는 경로가 포함되어 있습니까 |
|
그렇습니다 |
|
배열에 일치하는 경로가 포함되어 있습니까 |
|
다음의 조상인 첫 번째 배열 항목을 반환합니다. |
|
다음의 하위 항목인 첫 번째 배열 항목을 반환합니다. |
|
일치하는 첫 번째 배열 항목을 반환합니다. |
|
일치하는 첫 번째 배열 항목을 반환합니다. |
운영자<@, @, @그리고~유사함^<@, ^@, ^@, ^~, 인덱스를 토토하지 않는다는 점만 제외하면 동일합니다. 이는 테스트 목적으로만 유용합니다.
사용 가능한 기능은 다음에 표시됩니다.표 F.14.
표 F.14. 트리기능
트리표시된 연산자의 속도를 높일 수 있는 여러 유형의 색인을 지원합니다.
B-트리 인덱스 오버트리: <, <=, =, =,
GiST 인덱스 오버트리 (gist_ltree_opsopclass):<, <=, =, =, , @, <@, @, ~, ?
gist_ltree_opsGiST opclass는 경로 레이블 세트를 비트맵 서명으로 근사합니다. 선택적 정수 매개변수시글렌서명 길이를 바이트 단위로 결정합니다. 기본 서명 길이는 8바이트입니다. 길이는 다음의 양의 배수여야 합니다.int정렬(대부분의 시스템에서 4바이트)). 서명이 길수록 더 큰 인덱스를 사용하는 대신 더 정확한 검색(인덱스의 더 작은 부분과 더 적은 힙 페이지 스캔)이 가능합니다.
기본 서명 길이가 8바이트인 색인을 생성하는 예:
GIST(경로)를 토토하여 테스트할 때 INDEX path_gist_idx 생성;
서명 길이가 100바이트인 색인을 생성하는 예:
GIST를 사용하여 테스트할 때 path_gist_idx 인덱스 생성 (경로 gist_ltree_ops(siglen=100));
GiST 인덱스 오버트리[] (gist__ltree_opsopclass):ltree[] <@ ltree, ltree @ ltree[], @, ~, ?
gist__ltree_opsGiST opclass는 다음과 유사하게 작동합니다.gist_ltree_ops또한 서명 길이를 매개변수로 토토합니다. 기본값은시글렌ingist__ltree_ops28바이트입니다.
기본 서명 길이가 28바이트인 색인을 생성하는 예:
GIST(array_path)를 토토하여 테스트 중 INDEX path_gist_idx 생성;
서명 길이가 100바이트인 색인을 생성하는 예:
GIST를 사용하여 테스트 시 path_gist_idx 인덱스 생성 (array_path gist__ltree_ops(siglen=100));
참고: 이 색인 유형은 손실이 있습니다.
이 예는 다음 데이터를 사용합니다(파일에서도 사용 가능contrib/ltree/ltreetest.sql소스 배포판에서):
CREATE TABLE 테스트(경로 ltree);
테스트 값에 삽입('상위');
테스트 값에 삽입('Top.Science');
테스트 값에 삽입('Top.Science.Astronomy');
테스트 값에 삽입('Top.Science.Astronomy.Asphysics');
테스트 값에 삽입('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(경로)를 사용하여 INDEX 생성 path_gist_idx ON 테스트;
BTREE(경로)를 사용하여 테스트할 때 INDEX path_idx 생성;
이제 테이블이 생겼습니다테스트아래 표시된 계층 구조를 설명하는 데이터로 채워집니다.
맨위로
/ | \
과학 취미 컬렉션
/ | \
천문학 아마추어_천문학 사진
/ \ |
천체물리학 우주론 천문학
/ | \
은하계 별 우주 비행사
우리는 상속을 할 수 있습니다:
ltreetest= 테스트 WHERE 경로에서 경로 선택 <@ 'Top.Science';
경로
-----------------------
탑사이언스
탑.과학.천문학
상위.과학.천문학.천체물리학
상위.과학.천문학.우주론
(4행)
다음은 경로 일치의 몇 가지 예입니다:
ltreetest= 테스트 WHERE 경로에서 경로 선택 ~ '*.Astronomy.*';
경로
----------------------------------
탑.과학.천문학
상위.과학.천문학.천체물리학
상위.과학.천문학.우주론
상위.컬렉션.사진.천문학
상위.컬렉션.사진.천문학.별
Top.Collections.Pictures.Astronomy.Galaxies
상위.컬렉션.사진.천문학.우주비행사
(7열)
ltreetest= 테스트 위치에서 경로 선택 경로 ~ '*.!pictures@.Astronomy.*';
경로
-----------------------
탑.과학.천문학
상위.과학.천문학.천체물리학
상위.과학.천문학.우주론
(3행)
다음은 전체 텍스트 검색의 몇 가지 예입니다:
ltreetest= 테스트 위치에서 경로 선택 경로 @ 'Astro*% & !pictures@';
경로
-----------------------
탑.과학.천문학
상위.과학.천문학.천체물리학
상위.과학.천문학.우주론
탑.취미.아마추어_천문학
(4열)
ltreetest= 테스트 위치에서 경로 선택 path @ 'Astro* & !pictures@';
경로
-----------------------
탑.과학.천문학
상위.과학.천문학.천체물리학
상위.과학.천문학.우주론
(3행)
함수를 토토한 경로 구성:
ltreetest= SELECT subpath(path,0,2)||'Space'||subpath(path,2) FROM test WHERE path <@ 'Top.Science.Astronomy';
?열?
-----------------------------
상위.과학.우주.천문학
상위.과학.우주.천문학.천체물리학
상위.과학.우주.천문학.우주론
(3행)
경로의 지정된 위치에 라벨을 삽입하는 SQL 함수를 생성하여 이를 단순화할 수 있습니다.
CREATE FUNCTION ins_label(ltree, int, text) 반환 ltree
AS '선택 하위 경로($1,0,$2) || $3 || 하위 경로($1,$2);'
언어 SQL은 변경할 수 없습니다.
ltreetest= SELECT ins_label(path,2,'Space') FROM 테스트 WHERE 경로 <@ 'Top.Science.Astronomy';
ins_label
-----------------------------
상위.과학.우주.천문학
상위.과학.우주.천문학.천체물리학
상위.과학.우주.천문학.우주론
(3행)
다음에 대한 변환을 구현하는 추가 확장을 사용할 수 있습니다.트리44400_44449ltree_plpythonu, ltree_plpython2u및ltree_plpython3u(참조PostgreSQL : 문서 : 14 : 46.1. 토토 베이 2 vs. 토토 베이 3PL/Python 명명 규칙의 경우). 이러한 변환을 설치하고 함수 생성 시 지정하면,트리값은 Python 목록에 매핑됩니다. (단, 그 반대는 현재 지원되지 않습니다.)
변환 확장을 다음과 동일한 스키마에 설치하는 것이 좋습니다.트리. 그렇지 않고 변환 확장의 스키마에 적대적인 토토자가 정의한 개체가 포함되어 있으면 설치 시 보안 위험이 있습니다.
모든 작업은 Teodor Sigaev에 의해 수행되었습니다 (<teodor@stack.net) 및 Oleg Bartunov(<oleg@sai.msu.su). 참조http://www.sai.msu.su/~megera/postgres/gist/추가 정보를 확인하세요. 저자들은 유용한 토론을 해준 Eugeny Rodichev에게 감사를 표하고 싶습니다. 의견과 버그 신고를 환영합니다.
문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.