지원되는 버전:현재 (18) / 17 / 16 / 15 / 14 / 13
개발 버전:개발
지원되지 않는 버전:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3
이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.현재버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

F.21. l트리

이 모듈은 데이터 유형을 구현합니다.트리계층 구조에 저장된 데이터의 레이블을 표시하기 위한 것 나무 같은 구조. 검색을 위한 광범위한 시설 라벨 트리가 제공됩니다.

F.21.1. 정의

A 라벨는 다음의 시퀀스입니다 영숫자 및 밑줄(예: C 문자를 로케일로 지정A-Za-z0-9_있습니다 허용됨). 라벨 길이는 256바이트 미만이어야 합니다.

예:42, 개인_서비스

A 라벨 경로0의 시퀀스입니다. 점으로 구분된 하나 이상의 라벨(예:L1.L2.L3, 루트로부터의 경로를 나타냄 특정 노드에 대한 계층 트리. 라벨의 길이 경로는 65Kb 미만이어야 하지만 2Kb 미만으로 유지하는 것은 바람직하다. 실제로 이것은 큰 제한이 아닙니다. 에 대한 예: DMOZ 카탈로그에서 가장 긴 레이블 경로(http://www.dmoz.org)는 약 240바이트입니다.

예:상위.국가.유럽.러시아

트리모듈은 여러 가지를 제공합니다. 데이터 유형:

  • 트리라벨 경로를 저장합니다.

  • 쿼리은 일치를 위한 정규식과 유사한 패턴트리값. 간단한 단어가 해당 라벨과 일치합니다. 경로 내에서. 별 기호(*) 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.

    또한 수정되었을 수 있는 여러 개의 라벨을 작성할 수 있습니다 로 구분됨|(OR) 일치 해당 라벨 중 다음을 넣을 수 있습니다.!(NOT) 일치하지 않는 모든 레이블과 일치하도록 시작 부분에 대안 중 하나.

    여기에 주석이 달린 예가 있습니다.쿼리:

    톱.*0,2.sport*@.!football|tennis.Russ*|스페인
    가.  비.     기음.      디.               e.

    이 쿼리는 다음과 같은 모든 라벨 경로와 일치합니다:

    1. 라벨로 시작함상위

    2. 다음에는 이전에 0~2개의 라벨이 있습니다.

    3. 대소문자를 구분하지 않는 접두사로 시작하는 라벨스포츠

    4. 그러면 라벨이 일치하지 않습니다축구아니요테니스

    5. 다음으로 시작하는 라벨로 끝납니다.러스또는 정확히 일치함스페인.

  • ltxt쿼리는 일치를 위한 전체 텍스트 검색과 유사한 패턴트리값. 안ltxt쿼리값에는 단어가 포함되어 있습니다. 수정자@, *, %끝에; 수식어는 에서와 동일한 의미를 갖습니다.쿼리. 단어는 다음과 결합될 수 있습니다.&(그리고),|(또는),!(NOT) 및 괄호. 의 주요 차이점쿼리이다 그ltxt쿼리다음이 없는 단어와 일치합니다. 라벨 경로에서의 위치를 고려하세요.

    예는 다음과 같습니다.ltxt쿼리:

    유럽 및 러시아*@ 및 !교통

    이것은 라벨을 포함하는 경로와 일치합니다유럽및으로 시작하는 모든 라벨러시아(대소문자를 구분하지 않음), 그러나 그렇지 않음 라벨이 포함된 경로교통. 이 단어의 위치 경로 내에서는 중요하지 않습니다. 또한 언제%을 사용하면 해당 단어는 모든 항목과 일치할 수 있습니다. 레이블 내에서 밑줄로 구분된 단어 위치.

참고:ltxt쿼리공백을 허용합니다 기호 사이에 있지만트리그리고쿼리하지 마세요.

F.21.2. 연산자 및 함수

유형트리일반적인 비교가 있습니다 연산자=, <, <, , <=, =. 비교는 순서대로 정렬됩니다. 노드의 자식을 기준으로 정렬된 트리 순회 라벨 텍스트. 또한, 다음과 같은 전문 연산자를 사용합니다.표 F-14은 가능합니다.

표 F-14.트리연산자

운영자 반품 설명
트리 @ 트리 부울 왼쪽 인수는 오른쪽 인수(또는 같음)?
트리 <@ 트리 부울 왼쪽 인수는 오른쪽 인수(또는 같음)?
트리 ~ 쿼리 부울 그렇습니다트리일치쿼리?
쿼리 ~ 트리 부울 그렇습니다트리일치쿼리?
트리 ? l쿼리[] 부울 그렇습니다트리아무거나 일치쿼리배열로?
l쿼리[] ? 트리 부울 그렇습니다트리아무거나 일치쿼리배열로?
트리 @ ltxt쿼리 부울 그렇습니다트리일치ltxt쿼리?
ltxt쿼리 @ 트리 부울 그렇습니다트리일치ltxt쿼리?
트리 || 트리 트리 연결토토 커뮤니티경로
트리 || 텍스트 트리 텍스트를 다음으로 변환트리그리고 연결하다
텍스트 || 트리 트리 텍스트를 다음으로 변환트리그리고 연결하다
트리[] @ 트리 부울 배열에 다음의 조상이 포함되어 있습니까?트리?
트리 <@ 트리[] 부울 배열에 다음의 조상이 포함되어 있습니까?트리?
트리[] <@ 트리 부울 배열에 다음의 하위 항목이 포함되어 있습니까?트리?
트리 @ 트리[] 부울 배열에 다음의 하위 항목이 포함되어 있습니까?트리?
트리[] ~ 쿼리 부울 배열에 일치하는 경로가 포함되어 있습니까쿼리?
쿼리 ~ 트리[] 부울 배열에 일치하는 경로가 포함되어 있습니까쿼리?
트리[] ? l쿼리[] 부울 합니다트리배열에 임의의 항목 포함 모두와 일치하는 경로쿼리?
l쿼리[] ? 트리[] 부울 그렇습니다트리배열에 임의의 항목 포함 모두와 일치하는 경로쿼리?
트리[] @ ltxt쿼리 부울 배열에 일치하는 경로가 포함되어 있습니까ltxt쿼리?
ltxt쿼리 @ 트리[] 부울 배열에 일치하는 경로가 포함되어 있습니까ltxt쿼리?
트리[] ?@ 트리 트리 다음의 조상인 첫 번째 배열 항목트리; 없으면 NULL
트리[] ?<@ 트리 트리 다음의 하위 항목인 첫 번째 배열 항목트리; 없으면 NULL
트리[] ?~ 쿼리 트리 일치하는 첫 번째 배열 항목쿼리; 없으면 NULL
트리[] ?@ ltxt쿼리 트리 일치하는 첫 번째 배열 항목ltxt쿼리; 없으면 NULL

운영자<@, @, @그리고~유사함^<@, ^@, ^@, ^~, 인덱스를 사용하지 않는다는 점만 제외하면 동일합니다. 이것들은 유용하다 테스트 목적으로만 사용됩니다.

사용 가능한 기능은 다음에 표시됩니다.표 F-15.

표 F-15.트리기능

기능 반환 유형 설명 결과
sub토토 커뮤니티(토토 커뮤니티, int 시작, 끝 끝) 트리 하위 경로트리에서 위치시작위치로-1 (0부터 계산) sub토토 커뮤니티('Top.Child1.Child2',1,2) 아이1
하위 경로(토토 커뮤니티, int 오프셋, 정수 길이) 트리 하위 경로트리시작 시간 위치오프셋, 길이len. 만일오프셋음수이면 하위 경로가 시작됩니다. 길의 끝과는 거리가 멀다. 만일len음수이므로 그만큼 많이 남습니다. 경로 끝에 라벨을 붙입니다. 하위 경로('Top.Child1.Child2',0,2) Top.Child1
하위 경로(토토 커뮤니티, int 오프셋) 트리 하위 경로트리시작 시간 위치오프셋, 확장 경로 끝까지. 만일오프셋이다 부정, 하위 경로는 끝에서 멀리 떨어진 곳에서 시작됩니다. 경로. 하위 경로('Top.Child1.Child2',1) 아이1.아이2
n레벨(토토 커뮤니티) 정수 경로의 라벨 수 nlevel('Top.Child1.Child2') 3
색인(토토 커뮤니티 a, 토토 커뮤니티 비) 정수 첫 번째 발생 위치ba; -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(l트리, l트리, ...) 트리 최하위 공통 조상, 즉 가장 긴 공통 접두사 경로(최대 8개의 인수 지원) lca('1.2.2.3','1.2.3.4.5.6') 1.2
lca(토토 커뮤니티[]) 트리 최하위 공통 조상, 즉 가장 긴 공통 접두사 경로 lca(배열['1.2.2.3'::토토 커뮤니티,'1.2.3']) 1.2

F.21.3. 인덱스

트리여러 유형의 지원 표시된 연산자의 속도를 높일 수 있는 인덱스:

  • B-트리 인덱스 오버트리: <, <=, =, =,

  • GiST 인덱스 오버트리: <, <=, =, =, , @, <@, @, ~, ?

    그러한 색인 생성의 예:

    GIST(경로)를 사용하여 테스트 시 INDEX path_gist_idx 생성;
  • GiST 인덱스 오버트리[]: 토토 커뮤니티[] <@ 토토 커뮤니티, 토토 커뮤니티 @ 토토 커뮤니티[], @, ~, ?

    그러한 색인 생성의 예:

    GIST(array_path)를 사용하여 테스트 시 INDEX path_gist_idx 생성;

    참고: 이 인덱스 유형은 손실이 있습니다.

F.21.4. 예시

이 예는 다음 데이터를 사용합니다(파일에서도 사용 가능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= 테스트 위치에서 경로 선택 경로 @ '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행)

F.21.5. 저자

모든 작업은 Teodor Sigaev에 의해 수행되었습니다. () 및 올렉 바르투노프(). 참조http://www.sai.msu.su/~megera/postgres/gist/용 추가 정보. 저자는 Eugeny에게 감사를 표하고 싶습니다. 도움이 되는 토론을 해주신 Rodichev. 댓글과 버그 리포트는 환영합니다.