이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : F.22. 토토-계층 적 트리와 같은 데이터 유형버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

F.21. l트리

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

F.21.1. 정의

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}

    끝에 넣을 수 있는 몇 가지 수식자가 있습니다. 별표가 아닌 라벨 in쿼리일치시키려면 정확히 일치하는 것 이상입니다.

    @           예를 들어 대소문자를 구분하지 않고 일치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트리[] 부울 배열에 다음의 하위 항목이 포함되어 있습니까?트리?
트리[] ~ 쿼리 부울 배열에 일치하는 경로가 포함되어 있습니까쿼리?
쿼리 ~ 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
하위 경로(ltree, int 오프셋, int 렌) 트리 하위 경로트리위치에서 시작오프셋, 길이len. 만일오프셋이다 음수인 경우 하위 경로는 경로 끝에서 멀리 떨어진 곳에서 시작됩니다. 만일len음수이므로 라벨이 많이 남습니다. 길 끝에서. 하위 경로('Top.Child1.Child2',0,2) 상위.어린이1
하위 경로(ltree, int 오프셋) 트리 하위 경로트리위치에서 시작오프셋, 경로 끝까지 확장됩니다. 만일오프셋은 음수입니다. 하위 경로는 다음과 같이 시작합니다. 길의 끝과는 거리가 멀다. 하위 경로('Top.Child1.Child2',1) 아이1.아이2
n레벨(토토 사이트 추천) 정수 경로의 라벨 수 nlevel('Top.Child1.Child2') 3
색인(토토 사이트 추천 a, 토토 사이트 추천 b) 정수 첫 번째 발생 위치ba; -발견되지 않은 경우 -1 색인('0.1.2.3.5.4.5.6.8.5.6.8','5.6') 6
index(ltree a, ltree b, int 오프셋) 정수 첫 번째 발생 위치bina, 검색 시작 위치:오프셋; 부정오프셋시작을 의미합니다-오프셋끝부터 라벨 경로의 색인('0.1.2.3.5.4.5.6.8.5.6.8','5.6',-4) 9
text2ltree(텍스트) 트리 캐스트텍스트트리
토토 사이트 추천2text(토토 사이트 추천) 텍스트 캐스트트리텍스트
lca(토토 사이트 추천, 토토 사이트 추천, ...) 트리 경로의 가장 긴 공통 조상(인수 최대 8개) 지원) lca('1.2.3','1.2.3.4.5.6') 1.2
lca(토토 사이트 추천[]) 트리 배열에 있는 경로의 가장 긴 공통 조상 lca(배열['1.2.3'::ltree,'1.2.3.4']) 1.2

F.21.3. 인덱스

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

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

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

    그러한 색인 생성의 예:

    GIST(경로)를 사용하여 테스트할 때 INDEX path_gist_idx 생성;
  • GiST 인덱스 오버트리[]: ltree[] <@ ltree, 트리@ 트리[], @, ~, ?

    그러한 색인 생성의 예:

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

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

F.21.4. 예시

이 예는 다음 데이터를 사용합니다(파일에서도 사용 가능contrib/토토 사이트 추천/토토 사이트 추천test.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(path)를 사용하여 INDEX path_gist_idx ON 테스트 생성;
btree(path)를 사용하여 테스트할 때 INDEX path_idx 생성;

이제 테이블이 생겼습니다테스트채워짐 아래에 표시된 계층 구조를 설명하는 데이터가 포함되어 있습니다.

맨 위
                     / |  \
             과학 취미 컬렉션
                 / |              \
        천문학 아마추어_천문학 사진
           / \ |
천체물리학 우주론 천문학
                                        / |    \
                                 은하계 별 우주 비행사

우리는 상속을 할 수 있습니다:

ltreetest= 테스트 WHERE 경로에서 경로 선택 <@ 'Top.Science';
                경로
-----------------------
 탑사이언스
 탑.과학.천문학
 상위.과학.천문학.천체물리학
 상위.과학.천문학.우주론
(4행)

다음은 경로 일치의 몇 가지 예입니다:

ltreetest= 테스트 WHERE 경로에서 경로 선택 ~ '*.Astronomy.*';
                     경로
----------------------------------
 탑.과학.천문학
 상위.과학.천문학.천체물리학
 상위.과학.천문학.우주론
 상위.컬렉션.사진.천문학
 상위.컬렉션.사진.천문학.별
 Top.Collections.Pictures.Astronomy.Galaxies
 상위.컬렉션.사진.천문학.우주비행사
(7열)

ltreetest= 테스트 위치에서 경로 선택 경로 ~ '*.!pictures@.*.Astronomy.*';
                경로
-----------------------
 탑.과학.천문학
 상위.과학.천문학.천체물리학
 상위.과학.천문학.우주론
(3행)

다음은 전체 텍스트 검색의 몇 가지 예입니다:

ltreetest= 테스트 WHERE 경로에서 경로 선택 경로 @ '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행)

F.21.5. 저자

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