2025 년 9 월 4 일 :토토 결과 18 RC 1 릴리스!
이 문서는 지원되지 않는 버전의 토토 결과을위한 것입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다PostgreSQL : 문서 : 17 : 12.4. 추가버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

12.4. 추가 토토 결과

이 섹션에서는 추가 토토 결과과 연산자를 설명합니다 텍스트 검색과 관련하여 유용합니다.

12.4.1. 조작 서류

섹션 12.3.1원시 텍스트 문서를 어떻게 변환 할 수 있는지 보여주었습니다 안으로TSVECTOR값.토토 결과또한 함수를 제공합니다 문서를 조작하는 데 사용할 수있는 연산자 이미tsvector양식.

tsvector || tsvector

thetsvector연결 연산자는 Lexemes를 결합한 벡터를 반환합니다 주어진 두 벡터의 위치 정보 논쟁. 위치와 체중 레이블이 유지됩니다 연결 중에. 위치에 나타납니다 오른쪽 벡터는 가장 큰 위치에 따라 상쇄됩니다 왼쪽 벡터에 언급되어 결과가 수행 결과와 거의 동일합니다to_tsvectoron 두 개의 원본 문서 문자열의 연결. (그만큼 스톱 단어가 제거 되었기 때문에 동등성이 정확하지 않습니다 왼쪽 인수의 끝에서 영향을받지 않습니다. 결과는 영향을 미쳤을 것입니다 오른쪽 논쟁에서 Lexemes의 위치 텍스트 연결이 사용되었습니다.)

벡터에서 연결을 사용하는 한 가지 장점 적용하기 전에 텍스트를 연결하는 대신 양식to_tsvector, 당신은 당신입니다 다른 구성을 사용하여 다르게 구문 분석 할 수 있습니다 문서의 섹션. 또한 때문에setweight함수는 모든 lexemes를 표시합니다 주어진 벡터는 같은 방식으로 구문 분석해야합니다. 텍스트와 dosetweight다른 부품에 레이블을 지정하려는 경우 연결하기 전에 가중치가 다른 문서의.

setweight (Vector tsvector, 웨이트 "char") 반환TSVECTOR

setweight사본을 반환합니다 모든 위치가 있었던 입력 벡터의 주어진 레이블weight, 어느a, B, C또는d. (d새로운 기본값입니다 벡터 및 그와 같이 출력에 표시되지 않습니다.) 벡터가 연결되면 라벨이 유지됩니다. 문서의 다른 부분에서 단어가 순위에 따라 다르게 가중치를 부여합니다.

무게 라벨이 적용됨위치, 아님Lexemes. 입력 인 경우 벡터가 위치를 제거했습니다setweight아무것도하지 않습니다.

길이 (Vector TSVECTOR) 반환Integer

저장된 렉시 메스 수를 반환합니다 벡터.

Strip (Vector TSVECTOR) 반환TSVECTOR

동일한 Lexemes를 벡터가 주어 지지만 위치 나 무게가 부족합니다 정보. 반환 된 벡터는 훨씬 적습니다 관련성 순위를 위해 스트리핑되지 않은 벡터보다 유용하며 일반적으로 훨씬 작습니다.

12.4.2. 조작 쿼리

섹션 12.3.2원시 텍스트 쿼리를 어떻게 변환 할 수 있는지 보여주었습니다tsquery값.토토 결과또한 함수를 제공합니다 쿼리를 조작하는 데 사용할 수있는 연산자 이미tsquery양식.

tsquery && TSQUERY

주어진 두 가지의 복합을 반환합니다 쿼리.

tsquery || TSQUERY

주어진 두 사람의 또는 공동선을 반환합니다 쿼리.

!!tsquery

주어진 쿼리의 부정을 반환합니다.

Numnode (쿼리 tsquery) 반환Integer

노드 수를 반환합니다 (Lexemes Plus 연산자) 에서tsquery. 이 토토 결과은입니다 를 판단하는 데 유용합니다쿼리의미가 있습니다 (returns 0) 또는 중지 단어 만 포함합니다 (반환 0). 예 :

Numnode (Plainto_tsquery ( 'one'))를 선택합니다.
통지 : 쿼리에는 stopword 만 포함되거나 Lexeme (들)이 포함되어 있지 않습니다.
 Numnode
-------
       0

numnode ( 'foo & bar':: tsquery)를 선택하십시오.
 Numnode
-------
       3
QueryTree (쿼리 TSQUERY) 반환텍스트

a의 부분을 반환합니다tsquery인덱스 검색에 사용할 수 있습니다. 이 기능은입니다 예를 들어 무시할 수없는 쿼리를 감지하는 데 유용합니다 단어 만 포함하는 사람들은 단어 만 중지하거나 부정적인 용어 만 부정합니다. 예를 들어:

QueryTree를 선택합니다 (To_tsQuery ( '! defined'));
 Querytree
----------

12.4.2.1. 질문 다시 쓰기

theTS_REWRITE가족 함수 주어진 검색tsquery대상 하위 쿼리의 발생 및 각 발생을 대체합니다 대체 하위 쿼리. 본질적 으로이 작업은입니다.tsquery-특이 적 버전의 서브 스트링 대사. 대상과 대체 조합은 될 수 있습니다 에 대한 생각쿼리 재 작성 규칙. 이러한 재 작성 규칙의 모음은 강력한 검색이 될 수 있습니다. 지원. 예를 들어, 동의어를 사용하여 검색을 확장 할 수 있습니다 (예 :뉴욕, Big Apple, NYC, 고담) 또는 검색을 좁 힙니다 사용자를 일부 화제로 안내하십시오. 약간의 겹침이 있습니다 이 기능과 시소러스 사전 사이의 기능 (섹션 12.6.4). 그러나 재 작성 규칙 세트를 수정할 수 있습니다 동의어 사전을 업데이트하는 반면, 다시 한 번의 날개없이 효과를 얻으려면 Reindexi토토 결과이 필요합니다.

TS_REWRITE (쿼리 tsquery, 대상 tsquery, 대체 TSQUERY) 반환tsquery

이 형태의TS_REWRITE단순히 단일을 적용합니다 규칙 재 작성 :대상is 대체대체어디에서나쿼리. 예를 들어:

TS_REWRITE ( 'A & B':: TSQUERY, 'A':: TSQUERY, 'C':: TSQUERY);
 ts_rewrite
------------
 'b'& 'c'
TS_REWRITE (쿼리 tsquery, select 텍스트) 반환tsquery

이 형태의TS_REWRITE시작을 허용Query및 SQLselect명령 텍스트 문자열로 제공됩니다. 그만큼select두 열의 열을 생산해야합니다tsquery타입. 의 각 행에 대해select결과, 첫 번째 열 값 (대상)의 발생은 다음과 같습니다 두 번째 열 값 (대체)으로 대체 현재 내에서쿼리값. 예를 들어:

테이블 별칭 생성 (t tsquery 기본 키, SSQuery);
별칭 값 ( 'a', 'c')에 삽입;

선택 ts_rewrite ( 'a & b':: tsquery, 'select t, s from aliases');
 ts_rewrite
------------
 'b'& 'c'

여러 재 작성 규칙이 적용될 때 이런 식으로 적용 순서가 중요 할 수 있습니다. 그래서 실제로 소스 쿼리를 원할 것입니다.주문 by주문 열쇠.

실제 천문학적 사례를 고려해 봅시다. 잘 쿼리 확장Supernovae사용 테이블 중심 재 작성 규칙 :

테이블 별칭 생성 (t tsquery 기본 키, s tsquery);
별칭 값 (TO_TSQUERY ( 'supernovae'), to_tsquery ( 'supernovae | sn'))에 삽입;

선택 ts_rewrite (to_tsquery ( 'supernovae & crab'), 'select * from aliases');
           ts_rewrite            
--------------------------------------------
 '크랩'& ( 'supernova'| 'sn')

우리는 다시 작성하여 다시 쓰기 규칙을 변경할 수 있습니다. 테이블:

별칭 업데이트
set s = to_tsquery ( 'supernovae | sn &! nebulae')
여기서 t = to_tsquery ( 'supernovae');

선택 ts_rewrite (to_tsquery ( 'supernovae & crab'), 'select * from aliases');
                 ts_rewrite                  
----------------------------------------------------------
 '크랩'& ( 'supernova'| 'sn'&! 'nebula')

다시 쓰기 규칙이 있으면 재 작성이 느려질 수 있습니다. 가능한 일치에 대한 모든 규칙을 확인하므로. 필터 명백한 비 투사 규칙은 격리를 사용할 수 있습니다 운영자TSQUERY타입. 에서 아래의 예, 우리는 일치 할 수있는 규칙 만 선택합니다. 원래 쿼리 :

TS_REWRITE ( 'A & B':: TSQUERY,
                  ''a & b '':: tsquery @ t ') 여기서 aliases에서 t, s를 선택합니다);
 ts_rewrite
------------
 'b'& 'c'

12.4.3. 자동 트리거 업데이트

별도의 열을 사용하여 저장할 때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[, ... ])

이 트리거 함수는 자동으로 a를 계산합니다.TSVECTOR하나 이상의 텍스트 열에서 열, 열, 에 지정된 매개 변수의 제어하에트리거 만들기명령. 그들의 사용의 예 이다:

테이블 메시지 작성 (
    제목 텍스트,
    신체 텍스트,
    TSV TSVECTOR
);

삽입 또는 업데이트 전에 트리거 tsvectorupdate를 만듭니다
각 행의 메시지에서 프로 시저를 실행합니다
tsvector_update_trigger (tsv, 'pg_catalog.english', 제목, 신체);

메시지 값 ( '제목 여기', '본문 텍스트가 여기에 있습니다')에 삽입;

메시지에서 *를 선택하십시오.
   제목 |         바디 |            TSV             
------------+-----------------------------------------------------------
 여기 제목 | 바디 텍스트가 여기 있습니다 | 'bodi': 4 '텍스트': 5 'titl': 1

tsv @@ to_tsquery ( 'title & body')가있는 메시지에서 제목을 선택합니다.
   제목 |         몸          
------------+--------------------------
 여기 제목 | 신체 텍스트가 여기 있습니다

이 방아쇠를 만들어 냈습니다.제목또는Body자동으로 반영됩니다TSV, 응용 프로그램이 걱정할 필요없이 그것에 대해.

첫 번째 트리거 인수는의 이름이어야합니다.TSVECTOR열이 업데이트 될 열입니다. 두 번째 인수는 사용될 텍스트 검색 구성을 지정합니다. 변환을 수행하십시오. 을 위한tsvector_update_trigger, 구성 이름은 단순히 두 번째 트리거 인수로 주어집니다. 그럴 것입니다 트리거 동작을 위해 위에서 볼 수 있듯이 스키마 자격 변화에 따라 변하지 않을 것입니다search_path. 을 위한tsvector_update_trigger_column, 두 번째 트리거 인수는 다른 테이블 열의 이름입니다. 유형이어야합니다RegConfig. 이것은 a를 허용합니다 구성 할 구성의 로우 선택. 나머지 인수는 텍스트 열의 이름입니다 (유형텍스트, Varchar또는char). 이것들은 주어진 순서로 문서화하십시오. 널 값이 건너 뜁니다 (그러나 다른 열은 여전히 ​​인덱싱됩니다.)

이 내장 트리거의 제한은 그들이 치료한다는 것입니다. 모든 입력 열이 모두 나타납니다. 열을 다르게 처리하려면 - 예를 들어, 체중 제목과 신체와 다르게 - 사용자 정의 트리거를 작성하는 데 필요합니다. 다음은를 사용하는 예입니다.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를 만듭니다
    각 행에 대한 메시지에서 프로 시저 execute emsages_trigger ();

작성시 명시 적으로 구성 이름TSVECTOR트리거 내부의 값 칼럼 내용은 변경의 영향을받지 않습니다.default_text_search_config. 이 작업을 수행하지 못합니다 검색 결과 변화와 같은 문제로 이어질 가능성이 높습니다. 덤프 및 재 장전 후.

12.4.4. 문서 수집 통계

함수TS_STAT유용합니다 구성 확인 및 스톱 워드 찾기 후보자.

TS_STAT (sqlquery 텍스트, [ 웨이트 텍스트, ]
        밖으로Word 텍스트, outndoc Integer,
        밖으로Nentry Integer) 반환Setof Record

sqlquery는 텍스트 값입니다 단일을 반환 해야하는 SQL 쿼리가 포함되어 있습니다TSVECTOR열.TS_STAT쿼리를 실행하고 반환합니다 에 포함 된 각각의 고유 한 lexeme (Word)에 대한 통계TSVECTOR데이터. 열이 반환되었습니다 이다

  • Word 텍스트- Lexeme의 값

  • ndoc 정수- 문서 수 (TSVECTORs) 단어가 발생했습니다.

  • 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;