이 섹션은 텍스트 검색과 관련하여 유용한 추가 롤 토토 및 연산자를 설명합니다.
섹션 12.3.1원시 텍스트 문서가 어떻게 변환 될 수 있는지 보여주었습니다tsvector
값.PostgreSQL이미있는 문서를 조작하는 데 사용할 수있는 함수 및 연산자를 제공합니다tsvector
양식.
tsvector
|| TSVECTOR
thetsvector
연결 연산자는 인수로 주어진 두 벡터의 Lexemes와 위치 정보를 결합한 벡터를 반환합니다. 위치 및 중량 라벨은 연결 중에 유지됩니다. 오른쪽 벡터에 나타나는 위치는 왼쪽 벡터에서 언급 된 가장 큰 위치에 의해 상쇄되므로 결과는 수행 결과와 거의 동일합니다to_tsvector
두 개의 원본 문 문자열의 연결에. (왼쪽 인수의 끝에서 제거 된 중지 단어는 결과에 영향을 미치지 않지만 텍스트 상관 관계가 사용 된 경우 오른쪽 인수에서 Lexemes의 위치에 영향을 미쳤을 것입니다.).
적용하기 전에 텍스트를 연결하는 대신 벡터 형태의 연결을 사용하는 한 가지 장점to_tsvector
, 다른 구성을 사용하여 문서의 다른 섹션을 구문 분석 할 수 있습니다. 또한 때문에setweight
함수는 주어진 벡터의 모든 lexemes를 동일한 방식으로 표시합니다. 텍스트를 구문 분석하고 수행해야합니다setweight
문서의 다른 부분에 다른 가중치로 레이블을 지정하려는 경우 연결하기 전에.
setweight (Vector
TSVECTOR
, 웨이트
"char"
) 반환TSVECTOR
setweight
모든 위치가 주어진 상태로 표시된 입력 벡터의 사본을 반환합니다weight
, 어느a
, B
, C
, 또는d
. (D
는 새 벡터의 기본값이며 출력에 표시되지 않습니다.)이 레이블은 벡터가 연결되면 유지되므로 롤 토토 순위에 따라 문서의 다른 부분의 단어가 다르게 가중 될 수 있습니다..
무게 라벨이 적용됨위치, 아님lexemes. 입력 벡터가 위치를 제거한 경우setweight
아무것도하지 않습니다.
길이 (Vector
TSVECTOR
) 반환정수
벡터에 저장된 Lexemes의 수를 반환합니다.
Strip (Vector
TSVECTOR
) 반환tsvector
주어진 벡터와 동일한 lexemes를 나열하는 벡터를 반환하지만 위치 또는 중량 정보가 부족합니다. 결과는 일반적으로 스트리핑되지 않은 벡터보다 훨씬 작지만 덜 유용합니다. 관련성 순위는 스트리핑 된 벡터에서는 잘 작동하지 않습니다. 또한,<--
(뒤 따르는)롤 토토
연산자는 렉소에 발생하는 거리를 결정할 수 없기 때문에 스트리핑 입력과 일치하지 않습니다.
전체 목록TSVECTOR
-관련 함수는에서 사용할 수 있습니다표 9.43.
섹션 12.3.2원시 텍스트 쿼리를 어떻게 변환 할 수 있는지 보여주었습니다롤 토토
값.PostgreSQL이미있는 쿼리를 조작하는 데 사용할 수있는 함수 및 연산자를 제공합니다롤 토토
양식.
롤 토토
&& 롤 토토
주어진 쿼리의 두 가지를 반환합니다.
롤 토토
|| 롤 토토
주어진 쿼리의 또는 전달을 반환합니다.
!!롤 토토
주어진 쿼리의 부정을 반환합니다.
롤 토토
<--롤 토토
즉시 주어진 첫 번째 쿼리와 일치하는 쿼리를 반환 한 다음 즉시 주어진 쿼리와 일치하는 쿼리를 반환합니다.<--
(뒤 따르는)롤 토토
연산자. 예를 들어:
select to_롤 토토 ( 'fat') <- to_롤 토토 ( 'cat | rat'); ?열? ---------------------------- 'fat'<- ( 'cat'| 'rat')
롤 토토_PHRASE (Query1
롤 토토
, Query2
롤 토토
[,거리
Integer
]) 반환롤 토토
첫 번째 주어진 쿼리와 일치하는 쿼리를 반환 한 다음 정확히 거리에서 두 번째 주어진 쿼리와 일치하는 쿼리를 반환합니다.거리
lexemes, 사용<
n
롤 토토
운영자. 예를 들어:
롤 토토_PHRASE (TO_롤 토토 ( 'FAT'), TO_롤 토토 ( 'CAT'), 10); 롤 토토_phrase ----------------- 'fat'<10 '고양이'
Numnode (쿼리
롤 토토
) 반환Integer
A에서 노드 수 (Lexemes + 연산자)의 수를 반환합니다롤 토토
. 이 롤 토토은를 결정하는 데 유용합니다.쿼리
는 의미가 있거나 (반환 0) 또는 중지 단어 만 포함합니다 (반환 0). 예 :
Numnode (Plainto_롤 토토 ( 'The Any'))를 선택합니다. 통지 : 쿼리에는 stopword 만 포함되거나 Lexeme (들)이 포함되어 있지 않습니다. Numnode ------- 0 numnode ( 'foo & bar':: 롤 토토)를 선택하십시오. Numnode ------- 3
QueryTree (Query
롤 토토
) 반환텍스트
A의 부분을 반환합니다롤 토토
인덱스 검색에 사용할 수 있습니다. 이 기능은 무시 할 수없는 쿼리, 예를 들어 중지 단어 만 포함하는 쿼리를 감지하는 데 유용합니다. 예를 들어:
SELECT QUERYTREE (TO_롤 토토 ( 'defined')); Querytree ---------- '정의' select querytree (to_롤 토토 ( '! defined')); Querytree ---------- 티
theTS_REWRITE
롤 토토 가족 검색 주어진롤 토토
대상 하위 쿼리의 발생을 위해서는 각 발생을 대체 하위 쿼리로 교체합니다. 본질적 으로이 작업은입니다.롤 토토
-특이 적 버전의 서브 스트링 교체. 대상과 대체 조합은 A로 생각할 수 있습니다.쿼리 rewrite rul. 이러한 다시 쓰기 규칙의 모음은 강력한 검색 원조가 될 수 있습니다. 예를 들어, 동의어를 사용하여 검색을 확장 할 수 있습니다 (예 :뉴욕
, Big Apple
, NYC
, Gotham
) 또는 검색을 좁히기 위해 사용자를 핫 주제로 안내합니다. 이 롤 토토과 동의어 사전 사전 사이에는 롤 토토이 중복됩니다 (섹션 12.6.4). 그러나, 당신은 다시 문지인없이 다시 쓰기 규칙 세트를 수정할 수 있지만, 동의어 사전을 업데이트하려면 reindexing이 효과적이어야합니다.
TS_REWRITE (쿼리
롤 토토
, 대상
롤 토토
, 대체
롤 토토
) 반환롤 토토
이 형태의TS_REWRITE
단순히 단일 재 작성 규칙을 적용합니다 :대상
대체
어디에서나쿼리
. 예를 들어:
TS_REWRITE ( 'A & B':: 롤 토토, 'A':: 롤 토토, 'C':: 롤 토토); ts_rewrite ------------ 'b'& 'c'
TS_REWRITE (쿼리
롤 토토
, select
텍스트
) 반환롤 토토
이 형태의TS_REWRITE
시작을 허용쿼리
및 SQLselect
명령은 텍스트 문자열로 제공됩니다. 그만큼select
두 열의 열을 산출해야합니다롤 토토
타입. 의 각 행에 대해select
결과, 첫 번째 열 값의 발생 (대상)의 발생은 전류 내에서 두 번째 열 값 (대체)으로 대체됩니다.쿼리
값. 예를 들어:
테이블 별칭 생성 (t 롤 토토 기본 키, s 롤 토토); 별칭 값 ( 'a', 'c')에 삽입; 선택 ts_rewrite ( 'a & b':: 롤 토토, 'select t, s from aliases'); ts_rewrite ------------ 'b'& 'c'
이러한 방식으로 여러 다시 쓰기 규칙이 적용될 때 응용 프로그램 순서가 중요 할 수 있습니다. 실제로 소스 쿼리를 원할 것입니다.주문 by
일부 주문 키.
실제 천문학적 예를 고려해 봅시다. 쿼리를 확장 할 것입니다Supernovae
테이블 구동 재 작성 규칙 사용 :
테이블 별칭 생성 (t 롤 토토 기본 키, s 롤 토토); 별칭 값 (TO_롤 토토 ( 'supernovae'), to_롤 토토 ( 'supernovae | sn'))에 삽입; 선택 ts_rewrite (to_롤 토토 ( 'supernovae & crab'), 'select * from aliases'); ts_rewrite -------------------------------------------- '크랩'& ( 'supernova'| 'sn')
테이블을 업데이트하여 다시 쓰기 규칙을 변경할 수 있습니다.
별칭 업데이트 set s = to_롤 토토 ( 'supernovae | sn &! nebulae') 여기서 t = to_롤 토토 ( 'supernovae'); 선택 ts_rewrite (to_롤 토토 ( 'supernovae & crab'), 'select * from aliases'); ts_rewrite ---------------------------------------------------------- '크랩'& ( 'supernova'| 'sn'&! 'nebula')
가능한 많은 재 작성 규칙이있을 때 재 작성 속도가 느려질 수 있습니다. 모든 규칙이 가능한 일치를 확인하기 때문입니다. 명백한 비 후급 규칙을 필터링하기 위해 우리는 |롤 토토
타입. 아래 예에서는 원래 쿼리와 일치 할 수있는 규칙 만 선택합니다.
TS_REWRITE ( 'A & B':: 롤 토토, ''a & b '':: 롤 토토 @ t ') 여기서 aliases에서 t, s를 선택합니다); ts_rewrite ------------ 'b'& 'c'
이 섹션에 설명 된 방법은 저장된 생성 된 열의 사용에 의해 쓸모 없게되었습니다.섹션 12.2.2.
별도의 열을 사용하여 저장할 때TSVECTOR
문서의 표현은를 업데이트하려면 트리거를 만들어야합니다TSVECTOR
문서 내용 열이 변경 될 때 열. 이를 위해 두 개의 내장 트리거 롤 토토을 사용할 수 있거나 직접 쓸 수 있습니다.
tsvector_update_trigger (TSVECTOR_COLUMN_NAME
,config_name
,text_column_name
[, ... ])) tsvector_update_trigger_column (TSVECTOR_COLUMN_NAME
,config_column_name
,text_column_name
[, ... ])
이 트리거 함수는 자동으로 ATSVECTOR
하나 이상의 텍스트 열에서 열에서에 지정된 매개 변수의 제어에서트리거 만들기
명령. 그들의 사용의 예는 다음과 같습니다.
테이블 메시지 작성 ( 제목 텍스트, 신체 텍스트, TSV TSVECTOR ); 삽입 또는 업데이트 전에 트리거 tsvectorupdate를 만듭니다 각 행의 메시지에서 기능을 실행합니다 tsvector_update_trigger (tsv, 'pg_catalog.english', 제목, 신체); 메시지 값 ( '제목 여기', '본문 텍스트가 여기에 있습니다')에 삽입; 메시지에서 *를 선택하십시오. 제목 | 바디 | TSV ------------+----------------------------------------------------------- 여기 제목 | 바디 텍스트가 여기 있습니다 | 'bodi': 4 '텍스트': 5 'titl': 1 tsv @@ to_롤 토토 ( 'title & body')가있는 메시지에서 제목을 선택합니다. 제목 | 몸 ------------+-------------------------- 여기 제목 | 신체 텍스트가 여기 있습니다
이 방아쇠를 만들어 낸제목
또는Body
자동으로 반영됩니다TSV
, 응용 프로그램이 그것에 대해 걱정할 필요없이.
첫 번째 트리거 인수는의 이름이어야합니다.TSVECTOR
열이 업데이트 될 열입니다. 두 번째 인수는 변환을 수행하는 데 사용할 텍스트 검색 구성을 지정합니다. 을 위한tsvector_update_trigger
, 구성 이름은 단순히 두 번째 트리거 인수로 제공됩니다. 위에서 볼 수 있듯이 스키마 자격을 갖추어야하므로 트리거 동작이 변경되지 않도록 변하지 않도록search_path
. 을 위한tsvector_update_trigger_column
, 두 번째 트리거 인수는 다른 테이블 열의 이름이며, 이는 유형이어야합니다RegConfig
. 이를 통해 양의 구성을 선택할 수 있습니다. 나머지 인수는 텍스트 열의 이름입니다 (유형텍스트
, Varchar
또는char
). 주어진 순서대로 문서에 포함됩니다. NULL 값이 건너 뜁니다 (그러나 다른 열은 여전히 인덱싱됩니다).
이러한 내장 트리거의 제한은 모든 입력 열을 모두 처리한다는 것입니다. 열을 다르게 처리하려면 (예 : 신체와 다르게 무게 제목) 사용자 정의 트리거를 작성해야합니다. 다음은를 사용하는 예입니다.PL/PGSQL방아쇠 언어로 :
함수 작성 메시지 시작하다 new.tsv : = setweight (to_tsvector ( 'pg_catalog.english', Coalesce (new.title, ''), 'a') || setweight (to_tsvector ( 'pg_catalog.english', Coalesce (new.body, ''), 'd'); 새로운 반환; 끝 $$ 언어 plpgsql; 삽입 또는 업데이트 전에 트리거 tsvectorupdate를 만듭니다 각 행에 대한 메시지에서 기능 실행 함수 emsages_trigger ();
작성시 구성 이름을 명시 적으로 지정하는 것이 중요하다는 것을 명심하십시오tsvector
트리거 내부의 값이므로 열 내용이 변경에 영향을받지 않도록default_text_search_config
. 이렇게하지 않으면 덤프 및 복원 후 검색 결과가 변경되는 것과 같은 문제가 발생할 수 있습니다.
함수TS_STAT
구성을 확인하고 스톱 단어 후보를 찾는 데 유용합니다.
TS_STAT (sqlquery
텍스트
, [웨이트
텍스트
, ] 밖으로Word
텍스트
, outndoc
Integer
, 밖으로Nentry
정수
) 반환Setof Record
sqlquery
단일을 반환 해야하는 SQL 쿼리가 포함 된 텍스트 값입니다TSVECTOR
열.TS_STAT
쿼리를 실행하고에 포함 된 각 고유 한 Lexeme (Word)에 대한 통계를 반환합니다TSVECTOR
데이터. 반환 된 열은입니다.
Word
텍스트
- Lexeme의 값
NDOC
정수
- 문서 수 (TSVECTOR
s) 단어가 발생했습니다
Nentry
Integer
- 단어의 총 발생 수
if웨이트
공급되며, 그 중 하나를 갖는 발생 만 계산됩니다.
예를 들어, 문서 컬렉션에서 가장 빈번한 10 개의 단어를 찾으려면 :
선택 *에서 TS_STAT ( 'APOD에서 벡터 선택') Nentry Desc, Ndoc Desc, Word의 주문 제한 10;
동일하지만 무게로 단어 발생 만 계산a
또는B
:
선택 *에서 TS_STAT ( 'APOD에서 벡터 선택', 'AB') Nentry Desc, Ndoc Desc, Word의 주문 제한 10;
문서에 올바른 것이 없으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면