| 윈 토토 : 문서 : 9.4 : 윈 토토 | |||
|---|---|---|---|
| 와이즈 토토 : 문서 : 9.4 : LO | PostgreSQL : 문서 : 9.4 : 추가 제공 배트맨 토토 | 부록 F. 추가 제공 모듈 | 43_232 범퍼카 토토232 | | 
이 모듈은 데이터 유형을 구현합니다.트리계층적 트리 구조에 저장된 데이터의 레이블을 표시하기 위한 것입니다. 라벨 트리를 검색할 수 있는 광범위한 기능이 제공됩니다.
A 레이블은 일련의 영숫자와 밑줄입니다(예: C 로케일의 경우 문자A-Za-z0-9_허용됩니다). 라벨 길이는 256바이트 미만이어야 합니다.
예:42, 개인_서비스
A 라벨 경로는 점으로 구분된 0개 이상의 라벨 시퀀스입니다. 예를 들어L1.L2.L3, 계층 트리의 루트에서 특정 노드까지의 경로를 나타냅니다. 라벨 경로의 길이는 65Kb 미만이어야 하지만 2Kb 미만으로 유지하는 것이 좋습니다.
예:상위.국가.유럽.러시아
그트리모듈은 여러 데이터 유형을 제공합니다:
트리라벨 경로를 저장합니다.
쿼리정규식과 유사한 일치 패턴을 나타냅니다.트리값. 간단한 단어는 경로 내의 해당 레이블과 일치합니다. 별 기호(*)은 0개 이상의 라벨과 일치합니다. 예를 들면:
foo정확한 라벨 경로 일치foo*.foo.*라벨이 포함된 라벨 경로와 일치foo*.foo마지막 라벨이 다음과 같은 라벨 경로와 일치합니다.foo
별표 기호는 수량화되어 일치할 수 있는 라벨 수를 제한할 수도 있습니다.
*{n}        정확히 일치함n라벨
*{n,}       적어도 일치n라벨
*{n,m}      적어도 일치n그러나 그 이하m라벨
*{,m}       최대 일치m라벨 — 동일 *{0,m}
별표가 아닌 라벨 끝에 넣을 수 있는 몇 가지 수정자가 있습니다.쿼리완전히 일치하는 것 이상으로 일치시키려면:
@ 예를 들어 대소문자를 구분하지 않고 일치a@일치A * 이 접두사가 있는 라벨과 일치합니다. 예를 들어foo*일치foobar % 초기 밑줄로 구분된 단어 일치
의 행동%조금 복잡합니다. 전체 레이블이 아닌 단어를 일치시키려고 합니다. 예를 들어foo_bar%일치foo_bar_baz하지만 아님foo_barbaz. 와 결합된 경우*, 접두사 일치는 각 단어에 개별적으로 적용됩니다. 예를 들어foo_bar%*일치foo1_bar2_baz하지만 아님foo1_br2_baz.
또한 수정 가능성이 있는 여러 개의 라벨을 다음과 같이 구분하여 작성할 수 있습니다.|(또는) 해당 라벨 중 하나와 일치하도록 입력할 수 있습니다!(NOT) 시작 시 대안과 일치하지 않는 모든 레이블과 일치합니다.
여기에 주석이 달린 예가 있습니다.쿼리:
톱.*0,2.sport*@.!football|tennis.Russ*|스페인 가. 비. 기음. 디. e.
이 쿼리는 다음과 같은 모든 라벨 경로와 일치합니다:
라벨로 시작함상단
다음에는 이전에 0~2개의 라벨이 있습니다.
대소문자를 구분하지 않는 접두사로 시작하는 라벨스포츠
그러면 라벨이 일치하지 않습니다축구아니요테니스
다음으로 시작하는 라벨로 끝납니다.러스또는 정확히 일치함스페인.
ltxt쿼리일치에 대한 전체 텍스트 검색과 유사한 패턴을 나타냅니다.트리값. 안ltxt쿼리값에는 수식어가 있는 단어가 포함되어 있습니다.@, *, %끝에; 수식어는 에서와 동일한 의미를 갖습니다.쿼리. 단어는 다음과 결합될 수 있습니다.&(그리고),|(또는),!(NOT) 및 괄호. 의 주요 차이점쿼리그렇죠ltxt쿼리라벨 경로에서의 위치에 관계없이 단어를 일치시킵니다.
예는 다음과 같습니다.ltxt쿼리:
유럽 및 러시아*@ 및 !교통
이것은 라벨을 포함하는 경로와 일치합니다유럽및로 시작하는 모든 라벨러시아(대소문자를 구분하지 않음), 그러나 라벨이 포함된 경로는 제외교통. 경로 내에서 이러한 단어의 위치는 중요하지 않습니다. 또한 언제%을 사용하면 해당 단어는 위치에 관계없이 라벨 내의 밑줄로 구분된 모든 단어와 일치할 수 있습니다.
참고:ltxt쿼리기호 사이에 공백을 허용하지만트리그리고쿼리하지 마세요.
유형트리일반적인 비교 연산자가 있습니다=, <, <, , <=, =. 비교는 트리 순회 순서로 정렬되며 노드의 하위 노드는 레이블 텍스트별로 정렬됩니다. 또한, 다음과 같은 전문 연산자를 사용합니다.표 F-14사용 가능합니다.
표 F-14.트리연산자
| 운영자 | 반품 | 설명 | 
|---|---|---|
| 트리 @ 트리 | 부울 | 왼쪽 인수는 오른쪽(또는 동등)의 조상입니까? | 
| 트리 <@ 트리 | 부울 | 왼쪽 인수는 오른쪽(또는 동등)의 자손입니까? | 
| 트리 ~ 쿼리 | 부울 | 그렇습니다트리일치쿼리? | 
| 쿼리 ~ 트리 | 부울 | 그렇습니다트리일치쿼리? | 
| 트리 ? l쿼리[] | 부울 | 그렇습니다트리아무거나 일치쿼리배열로? | 
| l쿼리[] ? 트리 | 부울 | 그렇습니다트리아무거나 일치쿼리배열로? | 
| 트리 @ ltxt쿼리 | 부울 | 그렇습니다트리일치ltxt쿼리? | 
| ltxt쿼리 @ 트리 | 부울 | 그렇습니다트리일치ltxt쿼리? | 
| 트리 || 트리 | 트리 | 연결트리경로 | 
| 트리 || 텍스트 | 트리 | 텍스트를 다음으로 변환트리그리고 연결 | 
| 텍스트 || 트리 | 트리 | 텍스트를 다음으로 변환트리그리고 연결 | 
| l트리[] @ 트리 | 부울 | 배열에 다음의 조상이 포함되어 있습니까?트리? | 
| 트리 <@ l트리[] | 부울 | 배열에 다음의 조상이 포함되어 있습니까?트리? | 
| l트리[] <@ 트리 | 부울 | 배열에 다음의 하위 항목이 포함되어 있습니까?트리? | 
| 트리 @ l트리[] | 부울 | 배열에 다음의 하위 항목이 포함되어 있습니까?트리? | 
| l트리[] ~ 쿼리 | 부울 | 배열에 일치하는 경로가 포함되어 있습니까쿼리? | 
| 쿼리 ~ l트리[] | 부울 | 배열에 일치하는 경로가 포함되어 있습니까쿼리? | 
| l트리[] ? l쿼리[] | 부울 | 그렇습니다토토 사이트배열에는 일치하는 모든 경로가 포함되어 있습니다.쿼리? | 
| l쿼리[] ? 트리[] | 부울 | 그렇습니다트리배열에는 일치하는 모든 경로가 포함되어 있습니다.쿼리? | 
| 트리[] @ ltxt쿼리 | 부울 | 배열에 일치하는 경로가 포함되어 있습니까ltxt쿼리? | 
| ltxt쿼리 @ 트리[] | 부울 | 배열에 일치하는 경로가 포함되어 있습니까ltxt쿼리? | 
| 트리[] ?@ 트리 | 트리 | 다음의 조상인 첫 번째 배열 항목트리; 없으면 NULL | 
| 트리[] ?<@ 트리 | 트리 | 다음의 하위 항목인 첫 번째 배열 항목트리; 없으면 NULL | 
| 트리[] ?~ 쿼리 | 트리 | 일치하는 첫 번째 배열 항목쿼리; 없으면 NULL | 
| 트리[] ?@ ltxt쿼리 | 트리 | 일치하는 첫 번째 배열 항목ltxt쿼리; 없으면 NULL | 
운영자<@, @, @그리고~유사함^<@, ^@, ^@, ^~, 인덱스를 사용하지 않는다는 점만 제외하면 동일합니다. 이는 테스트 목적으로만 유용합니다.
사용 가능한 기능은 다음에 표시됩니다.표 F-15.
표 F-15.트리기능
| 기능 | 반환 유형 | 설명 | 예 | 결과 | 
|---|---|---|---|---|
sub토토 사이트(토토 사이트, int 시작, int 끝) | 
트리 | 하위 경로트리위치에서시작위치로끝-1 (0부터 계산) | sub토토 사이트('Top.Child1.Child2',1,2) | 아이1 | 
하위 경로(토토 사이트, int 오프셋, int len) | 
트리 | 하위 경로트리위치에서 시작오프셋, 길이len. 만일오프셋은 음수입니다. 하위 경로는 경로 끝에서 멀리 떨어진 곳에서 시작됩니다. 만일len음수이므로 경로 끝에 그만큼 많은 라벨이 남습니다. | 하위 경로('Top.Child1.Child2',0,2) | Top.Child1 | 
하위 경로(토토 사이트, int 오프셋) | 
트리 | 하위 경로트리위치에서 시작오프셋, 경로 끝까지 확장됩니다. 만일오프셋음수이면 하위 경로는 경로 끝에서 멀리 떨어진 곳에서 시작됩니다. | 하위 경로('Top.Child1.Child2',1) | 아이1.아이2 | 
n레벨(토토 사이트) | 
정수 | 경로의 라벨 수 | nlevel('Top.Child1.Child2') | 3 | 
색인(토토 사이트 a, 토토 사이트 b) | 
정수 | 첫 번째 발생 위치b에a; -발견되지 않은 경우 -1 | 색인('0.1.2.3.5.4.5.6.8.5.6.8','5.6') | 6 | 
index(토토 사이트 a, 토토 사이트 b, int 오프셋) | 
정수 | 첫 번째 발생 위치bina, 검색 시작 위치:오프셋; 부정오프셋시작을 의미합니다-오프셋경로 끝의 라벨 | 색인('0.1.2.3.5.4.5.6.8.5.6.8','5.6',-4) | 9 | 
text2토토 사이트(텍스트) | 
트리 | 캐스트텍스트에트리 | ||
토토 사이트2text(토토 사이트) | 
텍스트 | 캐스트트리에텍스트 | ||
lca(토토 사이트, 토토 사이트, ...) | 
트리 | 경로의 가장 긴 공통 조상(최대 8개의 인수 지원) | lca('1.2.3','1.2.3.4.5.6') | 1.2 | 
lca(토토 사이트[]) | 
트리 | 배열에 있는 경로의 가장 긴 공통 조상 | lca(배열['1.2.3'::토토 사이트,'1.2.3.4']) | 1.2 | 
트리표시된 연산자의 속도를 높일 수 있는 여러 유형의 색인을 지원합니다.
B-트리 인덱스 오버트리: <, <=, =, =,
GiST 인덱스 오버트리: <, <=, =, =, , @, <@, @, ~, ?
그러한 색인 생성의 예:
GIST(경로)를 사용하여 테스트할 때 INDEX path_gist_idx 생성;
GiST 인덱스 오버트리[]: 토토 사이트[] <@ 토토 사이트, 토토 사이트 @ 토토 사이트[], @, ~, ?
그러한 색인 생성의 예:
GIST(array_path)를 사용하여 테스트할 때 INDEX path_gist_idx 생성;
참고: 이 색인 유형은 손실이 있습니다.
이 예에서는 다음 데이터를 사용합니다(파일에서도 사용 가능contrib/토토 사이트/토토 사이트test.sql소스 배포판에서):
CREATE TABLE 테스트(경로 토토 사이트);
테스트 값에 삽입('상위');
테스트 값에 삽입('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(path)를 사용하여 INDEX path_gist_idx ON 테스트 생성;
btree(path)를 사용하여 테스트할 때 INDEX path_idx 생성;
이제 테이블이 생겼습니다테스트아래 표시된 계층 구조를 설명하는 데이터로 채워집니다.
맨 위
                     / |  \
             과학 취미 컬렉션
                 / |              \
        천문학 아마추어_천문학 사진
           / \ |
천체물리학 우주론 천문학
                                        / |    \
                                 은하계 별 우주 비행사
우리는 상속을 할 수 있습니다:
토토 사이트test= 테스트 WHERE 경로에서 경로 선택 <@ 'Top.Science';
                경로
-----------------------
 탑사이언스
 탑.과학.천문학
 상위.과학.천문학.천체물리학
 상위.과학.천문학.우주론
(4행)
다음은 경로 일치의 몇 가지 예입니다:
토토 사이트test= 테스트 WHERE 경로에서 경로 선택 ~ '*.Astronomy.*';
                     경로
----------------------------------
 탑.과학.천문학
 상위.과학.천문학.천체물리학
 상위.과학.천문학.우주론
 상위.컬렉션.사진.천문학
 상위.컬렉션.사진.천문학.별
 Top.Collections.Pictures.Astronomy.Galaxies
 상위.컬렉션.사진.천문학.우주비행사
(7열)
토토 사이트test= 테스트 위치에서 경로 선택 경로 ~ '*.!pictures@.*.Astronomy.*';
                경로
-----------------------
 탑.과학.천문학
 상위.과학.천문학.천체물리학
 상위.과학.천문학.우주론
(3행)
다음은 전체 텍스트 검색의 몇 가지 예입니다:
토토 사이트test= 테스트 WHERE 경로에서 경로 선택 경로 @ 'Astro*% & !pictures@';
                경로
-----------------------
 탑.과학.천문학
 상위.과학.천문학.천체물리학
 상위.과학.천문학.우주론
 탑.취미.아마추어_천문학
(4열)
토토 사이트test= 테스트 위치에서 경로 선택 path @ 'Astro* & !pictures@';
                경로
-----------------------
 탑.과학.천문학
 상위.과학.천문학.천체물리학
 상위.과학.천문학.우주론
(3행)
함수를 사용한 경로 구성:
토토 사이트test= SELECT subpath(path,0,2)||'Space'||subpath(path,2) FROM test WHERE path <@ 'Top.Science.Astronomy';
                 ?열?
-----------------------------
 상위.과학.우주.천문학
 상위.과학.우주.천문학.천체물리학
 상위.과학.우주.천문학.우주론
(3행)
경로의 지정된 위치에 라벨을 삽입하는 SQL 함수를 생성하여 이를 단순화할 수 있습니다.
CREATE FUNCTION ins_label(토토 사이트, int, text) 반환 토토 사이트
    AS '선택 하위 경로($1,0,$2) || $3 || 하위 경로($1,$2);'
    언어 SQL은 변경할 수 없습니다.
토토 사이트test= SELECT ins_label(path,2,'Space') FROM 테스트 WHERE 경로 <@ 'Top.Science.Astronomy';
                ins_label
-----------------------------
 상위.과학.우주.천문학
 상위.과학.우주.천문학.천체물리학
 상위.과학.우주.천문학.우주론
(3행)모든 작업은 Teodor Sigaev에 의해 수행되었습니다 (<teodor@stack.net) 및 Oleg Bartunov(<oleg@sai.msu.su). 참조http://www.sai.msu.su/~megera/postgres/gist/추가 정보를 확인하세요. 저자들은 유용한 토론을 해준 Eugeny Rodichev에게 감사를 표하고 싶습니다. 의견과 버그 신고를 환영합니다.