윈 토토 : 문서 : 9.4 : 윈 토토 9.4 | |||
---|---|---|---|
와이즈 토토 : 문서 : 9.4 : LO | PostgreSQL : 문서 : 9.4 : 추가 제공 배트맨 토토 | 부록 F. 추가 공급 모듈 | 43_232 범퍼카 토토 사이트232 | |
이 모듈은 데이터 유형을 구현합니다토토 사이트계층 적 트리와 같은 구조에 저장된 데이터의 레이블을 나타냅니다. 라벨 나무를 통해 검색을위한 광범위한 시설이 제공됩니다.
a레이블|a-za-z0-9_허용). 레이블은 256 바이트 길이 이상이어야합니다.
예 :42, personal_services
a레이블 경로예를 들어 도트로 분리 된 0 이상의 레이블의 시퀀스l1.l2.l3, 계층 적 트리의 루트에서 특정 노드까지 경로를 나타냅니다. 라벨 경로의 길이는 65kb 미만이어야하지만 2kb 아래로 유지하는 것이 좋습니다.
예 :top.countries.europe.russia
the토토 사이트모듈은 몇 가지 데이터 유형을 제공합니다.
토토 사이트레이블 경로를 저장합니다.
lQuery일치하는 일반 표현과 같은 패턴을 나타냅니다토토 사이트값. 간단한 단어는 경로 내에서 해당 레이블과 일치합니다. 별 기호 (*)는 0 이상의 레이블과 일치합니다. 예를 들어:
foo정확한 레이블 경로 일치foo*.foo.*레이블이 포함 된 라벨 경로 일치foo*.foo마지막 레이블이있는 라벨 경로 일치foo
스타 기호는 또한 일치 할 수있는 레이블 수를 제한하기 위해 정량화 될 수 있습니다.
*n정확히 일치n라벨*n,적어도 일치n라벨*n,m적어도 일치n그러나m라벨*,M최대 일치m라벨 -*0,m
비 스타 레이블의 끝에 몇 가지 수정자가 있습니다.LQuery정확히 일치보다 더 일치하게하려면 :
@예를 들어 케이스 비면적으로 일치합니다a@매치a * 예를 들어이 접두사와 라벨을 일치시킵니다foo*매치foobar%초기 밑줄이 구분 된 단어 일치
행동의 행동%조금 복잡합니다. 전체 레이블이 아닌 단어와 일치하려고합니다. 예를 들어foo_bar%매치foo_bar_baz하지만foo_barbaz. 와 결합 된 경우*, 접두사 매칭은 각 단어에 개별적으로 적용됩니다 (예 :foo_bar%*매치foo1_bar2_baz하지만FOO1_BR2_BAZ.
또한 분리 된 몇 가지 수정 된 레이블을 쓸 수 있습니다|(또는) 해당 라벨과 일치하려면!(아님) 처음에는 대안과 일치하지 않는 레이블과 일치합니다.
여기에 주석이 달린 예는LQuery:
상단.*0,2 .sport*@.! 풋볼 | Tennis.russ*| 스페인 에이. 비. 기음. 디. 이자형.
이 쿼리는 다음과 같은 라벨 경로와 일치합니다.
레이블로 시작TOP
그리고 다음은 이전에 0에서 두 개의 레이블이 있습니다
케이스 감수성 접두사로 시작하는 레이블스포츠
그러면 일치하지 않는 레이블축구NOR테니스
그런 다음로 시작하는 레이블로 끝납니다.Russ또는 정확히 일치하는스페인.
ltxtQuery일치하는 전체 텍스트 검색 패턴을 나타냅니다토토 사이트값.ltxtQuery값은 수정 자와 함께 단어를 포함합니다@, *, %끝에; 수정자는와 동일한 의미를 갖습니다.LQuery. 단어는와 결합 할 수 있습니다.&(및),|(또는),!(아님) 및 괄호. 의 주요 차이점LQueryltxtQuery레이블 경로에서의 위치와 상관없이 단어와 일치합니다.
여기 예입니다ltxtQuery:
유럽 및 러시아*@ &! 교통
이것은 레이블이 포함 된 경로와 일치합니다유럽러시아(사례에 민감하지 않음) 라벨을 포함하는 경로는 아닙니다교통. 경로 내 에서이 단어의 위치는 중요하지 않습니다. 또한%사용됩니다.이 단어는 위치에 관계없이 라벨 내의 밑줄 내에서 구분 된 단어와 일치 할 수 있습니다.
참고 :ltxtQuery기호 사이에 공백을 허용하지만토토 사이트andLQuerydo not.
타입토토 사이트일반적인 비교 연산자가 있습니다=, <, <, , <=, =. 비교는 트리 트래버스 순서대로 정렬되며 노드의 어린이는 레이블 텍스트로 정렬됩니다. 또한에 표시된 전문 운영자표 F-14사용 가능합니다.
표 F-14.토토 사이트운영자
운영자 | 반환 | 설명 |
---|---|---|
토토 사이트 @ 토토 사이트 | 부울 | 오른쪽 (또는 평등)의 조상 인 논증이 남아 있습니다. |
토토 사이트 <@ 토토 사이트 | 부울 | 오른쪽 (또는 평등)의 후손 인 왼쪽 논증입니까? |
토토 사이트 ~ LQuery | 부울 | do토토 사이트매치LQuery? |
LQuery ~ 토토 사이트 | 부울 | do토토 사이트매치LQuery? |
토토 사이트 ? lQuery [] | 부울 | do토토 사이트일치LQuery배열에서? |
lQuery [] ? 토토 사이트 | 부울 | do토토 사이트일치LQuery배열에서? |
토토 사이트 @ ltxtQuery | 부울 | do토토 사이트매치ltxtQuery? |
ltxtQuery @ 토토 사이트 | 부울 | do토토 사이트매치ltxtQuery? |
토토 사이트 || 토토 사이트 | 토토 사이트 | Concatenate토토 사이트Paths |
토토 사이트 || 텍스트 | 토토 사이트 | 텍스트 변환토토 사이트and concatenate |
텍스트 || 토토 사이트 | 토토 사이트 | 텍스트 변환토토 사이트and concatenate |
토토 사이트 [] @ 토토 사이트 | 부울 | 배열은 조상이 포함되어 있습니다토토 사이트? |
토토 사이트 <@ 토토 사이트 [] | 부울 | 배열은 조상이 포함되어 있습니다토토 사이트? |
토토 사이트 [] <@ 토토 사이트 | 부울 | 배열은의 후손이 포함되어 있습니다토토 사이트? |
토토 사이트 @ 토토 사이트 [] | 부울 | 배열은의 후손이 포함되어 있습니까토토 사이트? |
토토 사이트 [] ~ LQuery | 부울 | 배열이 모든 경로 일치를 포함합니까LQuery? |
LQuery ~ 토토 사이트 [] | 부울 | 배열이 모든 경로 일치를 포함합니까LQuery? |
토토 사이트 [] ? lQuery [] | 부울 | do토토 사이트배열 일치하는 경로가 포함되어 있습니다LQuery? |
lQuery [] ? 토토 사이트 [] | 부울 | do토토 사이트배열은 어떤 경로와 일치하는 경로를 포함합니다LQuery? |
토토 사이트 [] @ ltxtQuery | 부울 | 배열은 모든 경로 일치를 포함합니까ltxtQuery? |
ltxtQuery @ 토토 사이트 [] | 부울 | 배열은 모든 경로 일치를 포함합니까ltxtQuery? |
토토 사이트 [] ?@ 토토 사이트 | 토토 사이트 | 조상 인 첫 번째 배열 항목토토 사이트; null if none |
토토 사이트 [] ? <@ 토토 사이트 | 토토 사이트 | 첫 번째 배열 항목의 후손 인토토 사이트; null if none |
토토 사이트 [] ? ~ LQuery | 토토 사이트 | 일치하는 첫 번째 배열 항목LQuery; null if none |
토토 사이트 [] ?@ ltxtQuery | 토토 사이트 | 일치하는 첫 번째 배열 항목ltxtQuery; null if none |
연산자<@, @, @and~아날로그가 있습니다^<@, ^@, ^@, ^~, 인덱스를 사용하지 않는 것을 제외하고는 동일합니다. 테스트 목적으로 만 유용합니다.
가용 함수는에 표시됩니다.표 F-15.
테이블 F-15.토토 사이트기능
기능 | 반환 유형 | 설명 | example | 결과 |
---|---|---|---|---|
Sub토토 사이트 (토토 사이트, int start, int end) |
토토 사이트 | subpath of토토 사이트위치에서시작위치END-1 (0에서 카운트) | sub토토 사이트 ( 'top.child1.child2', 1,2) | Child1 |
subpath (토토 사이트, int offset, int len) |
토토 사이트 | subpath of토토 사이트위치에서 시작오프셋, 길이Len. 만약에오프셋부정적이며, 서브 포트는 경로 끝에서 멀리 떨어져 시작합니다. 만약에Len부정적이고 경로 끝에서 많은 라벨이 나옵니다. | subpath ( 'top.child1.child2', 0,2) | top.child1 |
subpath (토토 사이트, int 오프셋) |
토토 사이트 | subpath of토토 사이트위치에서 시작오프셋, 경로 끝으로 확장. 만약에오프셋부정적입니다. Subpath는 경로 끝에서 멀리 떨어져 시작합니다. | subpath ( 'top.child1.child2', 1) | child1.child2 |
nlevel (토토 사이트) |
Integer | 경로의 레이블 수 | nlevel ( 'top.child1.child2') | 3 |
색인 (토토 사이트 A, 토토 사이트 B) |
정수 | 첫 번째 발생 위치Bina; -1 찾을 수없는 경우 | index ( '0.1.2.3.5.4.5.6.8.5.6.8', '5.6') | 6 |
index (Ltree A, Ltree B, int 오프셋) |
Integer | 첫 번째 발생 위치Bina오프셋; 부정적인오프셋start-오프셋경로 끝의 레이블 | index ( '0.1.2.3.5.4.5.6.8.5.6.8', '5.6', -4) | 9 |
text2토토 사이트 (text) |
토토 사이트 | 캐스트텍스트to토토 사이트 | ||
토토 사이트2text (토토 사이트) |
텍스트 | 캐스트토토 사이트to텍스트 | ||
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-Tree Index over토토 사이트: <, <=, =, =,
Gist Index over토토 사이트: <, <=, =, =, , @, <@, @, ~, ?
그러한 색인 생성 예 :
GIST (PATH)를 사용하여 테스트에서 인덱스 PATH_GIST_IDX 생성;
Gist Index over토토 사이트 []: 토토 사이트 [] <@ 토토 사이트, 토토 사이트 @ 토토 사이트 [], @, ~, ?
그러한 색인 생성의 예 :
GIST (array_path)를 사용하여 테스트에서 인덱스 PATH_GIST_IDX 작성;
참고 :이 인덱스 유형은 손실됩니다.
이 예제는 다음 데이터를 사용합니다 (파일에서도 사용 가능Contrib/토토 사이트/토토 사이트test.sql소스 분포에서) :
테이블 테스트 생성 (Path Ltree); 테스트 값에 삽입 ( 'TOP'); 테스트 값에 삽입 ( '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를 만듭니다.
이제 테이블이 있습니다테스트아래에 표시된 계층을 설명하는 데이터가 채워져 있습니다.
상단 / | \ 과학 취미 컬렉션 / | \ 천문학 Amateurs_astronomy 사진 / \ | 천체 물리학 우주론 천문학 / | \ 은하의 스타 우주 비행사
우리는 상속을 할 수 있습니다 :
토토 사이트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@.*. 천문학.*'; 길 --------------------------------------- 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 (Path, 0,2) || 'Space'|| SubPath (Path, 2)는 <@ '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 줄)
모든 작업은 Teodor Sigaev (에 의해 수행되었습니다.<reodor@stack.net
) 및 Oleg Bartunov (<oleg@sai.msu.su
). 보다http : //www.sai.msu.su/~megera/postgres/gist/추가 정보. 저자는 유용한 토론에 대해 Eugeny Rodichev에게 감사의 말씀을 전합니다. 의견과 버그 보고서를 환영합니다.