이 모듈은 데이터 유형을 구현합니다토토 사이트
계층 적 트리와 같은 구조에 저장된 데이터의 레이블을 나타냅니다. 라벨 나무를 통해 검색을위한 광범위한 시설이 제공됩니다.
이 모듈이 고려됩니다“신뢰할 수있는”Create
현재 데이터베이스의 권한.
a레이블는 영숫자, 밑줄 및 하이픈의 순서입니다. 유효한 영숫자 문자 범위는 데이터베이스 로케일에 따라 다릅니다. 예를 들어, C Locale에서 캐릭터a-za-z0-9_-
허용됩니다. 레이블은 길이가 1000 자를 초과하지 않아야합니다.
예 :42
, personal_services
a레이블 경로예를 들어 도트로 분리 된 0 이상의 레이블의 시퀀스l1.l2.l3
, 계층 적 트리의 루트에서 특정 노드까지 경로를 나타냅니다. 레이블 경로의 길이는 65535 라벨을 초과 할 수 없습니다.
예 :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
n
,m
적어도 일치n
하지만M
발생foo
foo ,발생 수의 모든 사건과 일치foo
, 0을 포함하여
명시적인 정량자가없는 경우 별 기호의 기본값은 여러 레이블과 일치하는 것입니다 (즉,,
) 비 스타트 항목의 기본값은 정확히 한 번 일치하는 동안 (즉,1
).
비 스타의 끝에 넣을 수있는 몇 가지 수정자가 있습니다LQuery
정확히 일치하는 것 이상으로 일치하는 항목 :
@예를 들어 사례 비면적으로 일치a@
매치a
* 예를 들어이 접두사와 라벨을 일치시킵니다foo*
매치foobar
%초기 밑줄을 구분 한 단어 일치
행동%
조금 복잡합니다. 전체 레이블이 아닌 단어와 일치하려고합니다. 예를 들어foo_bar%
매치foo_bar_baz
하지만foo_barbaz
. 와 결합 된 경우*
, 접두사 매칭은 각 단어에 개별적으로 적용됩니다 (예 :foo_bar%*
매치foo1_bar2_baz
하지만FOO1_BR2_BAZ
.
또한 분리 된 몇 가지 수정 된 비 스타일 항목을 쓸 수 있습니다|
(또는) 해당 항목과 일치하려면!
(아님) 비 스타 그룹의 시작시 대안과 일치하지 않는 레이블과 일치합니다. 수량자는 그룹의 끝에갑니다. 그것은 그룹 전체에 대한 몇 가지 일치를 의미합니다 (즉, 일부 레이블이 대안과 일치하거나 일치하지 않음)..
여기에 주석이 달린 예는입니다.LQuery
:
TOP.*0,2 .Sport*@.! Football | Tennis 1,. Russ*| Spain 에이. 비. 기음. 디. 이자형.
이 쿼리는 다음과 같은 라벨 경로와 일치합니다.
레이블로 시작합니다TOP
그리고 다음은 이전에 0에서 두 개의 레이블이 있습니다
케이스 감수성 접두사로 시작하는 레이블스포츠
그런 다음 하나 이상의 레이블이 있으며 그 중 어느 것도 일치하지 않습니다Football
17999_18006테니스
그런 다음로 시작하는 레이블로 끝납니다.Russ
또는 정확히 일치하는스페인
.
ltxtQuery
일치하는 전체 텍스트 검색 패턴을 나타냅니다토토 사이트
값.ltxtQuery
값은 수정 자와 함께 단어를 포함합니다@
, *
, %
끝에; 수정자는와 동일한 의미를 갖습니다.LQuery
. 단어는와 결합 할 수 있습니다.&
(및),|
(또는),!
(아님) 및 괄호. 의 주요 차이점LQuery
ltxtQuery
레이블 경로에서의 위치와 상관없이 단어와 일치합니다.
여기 예입니다ltxtQuery
:
유럽 및 러시아*@ &! 교통
이것은 레이블을 포함하는 경로와 일치합니다유럽
러시아
(사례에 민감하지 않음) 라벨을 포함하는 경로는 아닙니다교통
. 경로 내 에서이 단어의 위치는 중요하지 않습니다. 또한%
사용됩니다.이 단어는 위치에 관계없이 라벨 내의 밑줄 내에서 구분 된 단어와 일치 할 수 있습니다.
참고 :ltxtQuery
기호 사이에 공백을 허용하지만토토 사이트
andLQuery
do not.
타입토토 사이트
일반적인 비교 연산자가 있습니다=
, <
, <
, ,
<=
, =
. 비교는 트리 트래버스 순서대로 정렬되며 노드의 어린이는 레이블 텍스트로 정렬됩니다. 또한에 표시된 전문 운영자테이블 F.12사용 가능합니다.
표 F.12. 토토 사이트
운영자
운영자 설명 |
---|
오른쪽 (또는 평등)의 조상 인 논증이 남아 있습니다. |
왼쪽 주장은 오른쪽 (또는 평등)의 후손입니까? |
do |
do |
do |
|
텍스트 변환 |
배열은의 조상이 포함되어 있습니까 |
배열은의 후손이 포함되어 있습니다 |
배열이 모든 경로 일치가 포함되어 있습니까 |
do |
배열이 모든 경로 일치를 포함합니까 |
의 조상 인 첫 번째 배열 항목을 반환합니다 |
후손 인 첫 번째 배열 항목을 반환합니다 |
일치하는 첫 번째 배열 항목을 반환 |
일치하는 첫 번째 배열 항목을 반환 |
연산자<@
, @
, @
and~
아날로그^<@
, ^@
, ^@
, ^~
, 인덱스를 사용하지 않는 것을 제외하고는 동일합니다. 테스트 목적으로 만 유용합니다.
가용 함수는에 표시됩니다.테이블 F.13.
표 F.13. 토토 사이트
기능
토토 사이트
표시된 연산자 속도를 높일 수있는 여러 유형의 인덱스를 지원합니다.
B-Tree Index over토토 사이트
: <
, <=
, =
, =
,
해시 색인 오버토토 사이트
: =
Gist Index over토토 사이트
(gist_토토 사이트_ops
opclass) :<
, <=
, =
, =
, ,
@
, <@
, @
, ~
, ?
gist_토토 사이트_ops
Gist Opclass는 경로 레이블 세트를 비트 맵 서명으로 근사합니다. 선택적 정수 매개 변수Siglen
시그니처 길이를 바이트로 결정합니다. 기본 서명 길이는 8 바이트입니다. 길이는 긍정적 인 배수이어야합니다.int
정렬 (대부분의 기계에서 4 바이트)) 최대 2024 년까지. 더 긴 서명이 더 정확한 검색으로 이어집니다 (더 큰 인덱스의 비용으로 더 적은 부분을 스캔하고 더 적은 힙 페이지를 스캔).
기본 서명 길이 8 바이트로 이러한 색인 생성 예 :
GIST (PATH)를 사용하여 테스트에서 인덱스 PATH_GIST_IDX 생성;
서명 길이 100 바이트를 가진 인덱스 생성 예 :
GIST를 사용하여 테스트시 인덱스 PATH_GIST_IDX 작성 (PATH GIST_토토 사이트_OPS (SIGLEN = 100));
Gist Index over토토 사이트 []
(gist__토토 사이트_ops
opclass) :토토 사이트 [] <@ 토토 사이트
, 토토 사이트 @ 토토 사이트 []
, @
, ~
, ?
gist__토토 사이트_ops
Gist Opclass는와 유사하게 작동합니다.gist_토토 사이트_ops
그리고 서명 길이를 매개 변수로 취합니다. 의 기본값Siglen
ingist__토토 사이트_ops
IS 28 바이트입니다.
기본 서명 길이 28 바이트로 이러한 인덱스 생성 예 :
GIST (array_path)를 사용하여 테스트에서 인덱스 PATH_GIST_IDX 생성;
서명 길이가 100 바이트 인 인덱스 생성 예 :
GIST를 사용하여 테스트시 인덱스 PATH_GIST_IDX 작성 (Array_Path GIST__토토 사이트_OPS (SIGLEN = 100));
참고 :이 색인 유형은 손실입니다.
이 예제는 다음 데이터를 사용합니다 (파일에서도 사용 가능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를 만듭니다. HASH (PATH);을 사용하여 테스트시 인덱스 PATH_HASH_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@.astronomy.*'; 길 --------------------------------------- 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)는 Path <@ '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 줄)
the토토 사이트_plpython3u
Extension Ampess the Transforms토토 사이트
pl/python의 입력. 함수를 만들 때 설치 및 지정된 경우토토 사이트
값은 Python 목록에 매핑됩니다. (그러나 그 반대는 현재 지원되지 않습니다.)
모든 작업은 Teodor Sigaev (에 의해 수행되었습니다.<reodor@stack.net
) 및 Oleg Bartunov (<oleg@sai.msu.su
). 보다http : //www.sai.msu.su/~megera/postgres/gist/추가 정보. 저자는 유용한 토론에 대해 Eugeny Rodichev에게 감사의 말씀을 전합니다. 의견과 버그 보고서를 환영합니다.