2025년 9월 25일:토토 커뮤니티 : 토토
이 문서는 지원되지 않는 토토 결과 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : 12.4. 추가 롤 토토버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

12.4. 추가 토토 결과

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

12.4.1. 조작 서류

섹션 12.3.1원본 텍스트 문서를 변환하는 방법을 보여주었습니다. 안으로ts벡터값.토토 결과또한 기능을 제공하며 문서를 조작하는 데 사용할 수 있는 연산자 이미 들어왔어ts벡터양식.

ts벡터 || ts벡터

ts벡터연결 연산자는 어휘소와 다음과 같이 주어진 두 벡터의 위치 정보 인수. 위치와 체중 라벨이 유지됩니다. 연결하는 동안. 에 등장하는 포지션 오른쪽 벡터는 가장 큰 위치로 오프셋됩니다. 왼쪽 벡터에 언급되었으므로 결과는 다음과 같습니다. 수행 결과와 거의 동일함to_tsVector에 두 개의 원본 문서 문자열을 연결합니다. ( 불용어가 제거되었기 때문에 동등성이 정확하지 않습니다. 왼쪽 인수의 끝부터 영향을 미치지 않습니다. 결과에는 영향을 미쳤을 것입니다. 다음과 같은 경우 오른쪽 인수에서 어휘의 위치 텍스트 연결이 사용되었습니다.)

벡터에서 연결 사용의 장점 중 하나 적용하기 전에 텍스트를 연결하는 대신 양식을 작성하세요.to_tsVector, 당신인가요? 서로 다른 구성을 사용하여 서로 다른 구문을 분석할 수 있습니다. 문서의 섹션. 또한, 왜냐하면설정중량함수는 다음의 모든 어휘를 표시합니다. 주어진 벡터를 같은 방식으로 분석해야 합니다. 텍스트와 행동설정중량다른 부분에 라벨을 지정하려면 연결하기 전에 무게가 다른 문서의.

설정중량(벡터 ts벡터, 무게 "문자") 반환ts벡터

설정중량사본을 반환합니다. 모든 위치가 포함된 입력 벡터의 주어진로 라벨이 지정됨무게, 둘 중 하나A, B, C또는D. (D새 항목의 기본값입니다. 벡터이므로 출력에 표시되지 않습니다.) 벡터가 연결될 때 레이블은 유지됩니다. 문서의 다른 부분에 있는 단어를 허용 순위 함수에 따라 가중치가 다르게 부여됩니다.

무게 라벨이 다음에 적용된다는 점에 유의하세요.위치, 아님어휘. 입력의 경우 벡터의 위치가 제거되었습니다.설정중량아무것도 하지 않습니다.

길이(벡터 ts벡터) 반환정수

다음에 저장된 어휘의 수를 반환합니다. 벡터.

스트립(벡터 ts벡터) 반환ts벡터

다음과 동일한 어휘를 나열하는 벡터를 반환합니다. 주어진 벡터이지만 위치나 가중치가 없습니다. 정보. 반환된 벡터는 훨씬 적지만 관련성 순위에 대해서는 제거되지 않은 벡터보다 유용합니다. 일반적으로 훨씬 더 작습니다.

12.4.2. 조작 쿼리

섹션 12.3.2원시 텍스트 쿼리를 다음으로 변환하는 방법을 보여주었습니다.tsquery값.토토 결과또한 토토 결과을 제공하며 쿼리를 조작하는 데 사용할 수 있는 연산자 이미 들어왔어tsquery양식.

tsquery && tsquery

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

tsquery || tsquery

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

!! tsquery

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

numnode(질의 tsquery) 반환정수

노드 수를 반환합니다(어휘소와 연산자) 에서tsquery. 이 기능은 다음을 결정하는 데 유용합니다.질의의미 있음(반환 0) 또는 중지 단어만 포함합니다(0 반환). 예:

SELECT numnode(plainto_tsquery('모든'));
주의사항: 쿼리에 불용어만 포함되어 있거나 어휘소가 포함되어 있지 않습니다. 무시됩니다.
 숫자 노드
---------
       0

SELECT numnode('foo & bar'::tsquery);
 숫자 노드
---------
       3
쿼리트리(질의 tsquery) 반환텍스트

a의 일부를 반환합니다.tsquery색인 검색에 사용할 수 있습니다. 이 토토 결과은 색인을 생성할 수 없는 쿼리를 감지하는 데 유용합니다. 예를 들어 불용어만 포함하거나 부정 용어만 포함하는 단어입니다. 예를 들면:

SELECT querytree(to_tsquery('!defined'));
 쿼리트리
-----------

12.4.2.1. 쿼리 재작성

ts_rewrite가족 함수는 주어진 것을 검색합니다tsquery용 대상 하위 쿼리 발생 및 각 발생 대체 대체 하위 쿼리로. 본질적으로 이 작업은 다음과 같습니다.tsquery하위 문자열의 특정 버전 교체. 대상과 대체 조합은 다음과 같습니다. 로 생각됨쿼리 재작성 규칙. 이러한 재작성 규칙 모음은 강력한 검색이 될 수 있습니다. 원조. 예를 들어 동의어를 사용하여 검색을 확장할 수 있습니다. (예:뉴욕, 큰 사과, 뉴욕, 고담) 또는 다음으로 검색 범위를 좁힙니다. 사용자를 인기 있는 주제로 안내합니다. 일부 중복되는 내용이 있습니다. 이 기능과 동의어 사전 사이의 기능 (섹션 12.6.4). 그러나 다시 쓰기 규칙 집합을 수정할 수 있습니다. 다시 색인화하지 않고 즉석에서 동의어 사전을 업데이트하는 동안 효과적이려면 색인을 다시 생성해야 합니다.

ts_rewrite (질의 tsquery, 대상 tsquery, 대체 tsquery) 반환tsquery

이 형태는ts_rewrite단순히 단일 적용 재작성 규칙:대상입니다 다음으로 대체됨대체어디에나 나타나는지질의. 예를 들면:

SELECT ts_rewrite('a & b'::tsquery, 'a'::tsquery, 'c'::tsquery);
 ts_rewrite
------------
 'b' & 'c'
ts_rewrite (질의 tsquery, 선택 텍스트) 반환tsquery

이 형태는ts_rewrite시작을 받아들입니다쿼리그리고 SQL선택명령, 이는 텍스트 문자열로 제공됩니다.선택두 개의 열을 생성해야 합니다.tsquery유형. 의 각 행에 대해선택결과, 첫 번째 열 값(대상)의 발생 횟수는 다음과 같습니다. 두 번째 열 값으로 대체됨(대체) 현재 내에서쿼리값. 예를 들면:

CREATE TABLE 별칭(t tsquery PRIMARY KEY, s tsquery);
INSERT INTO 별칭 VALUES('a', 'c');

SELECT ts_rewrite('a & b'::tsquery, 'SELECT t,s FROM 별칭');
 ts_rewrite
------------
 'b' & 'c'

여러 재작성 규칙이 적용될 때 주의하세요 이런 식으로 신청 순서가 중요할 수 있습니다. 그래서 실제로는 소스 쿼리가 다음을 원할 것입니다.주문 기준일부 주문 열쇠.

실제 천문학적 예를 생각해 봅시다. 우리는 쿼리 확장초신성사용 중 테이블 기반 재작성 규칙:

CREATE TABLE 별칭(t tsquery 기본 키, s tsquery);
INSERT INTO 별칭 VALUES(to_tsquery('supernovae'), to_tsquery('supernovae|sn'));

SELECT ts_rewrite(to_tsquery('초신성 & 게'), 'SELECT * FROM 별칭');
           ts_rewrite            
---------------------------------
 '게' & ( '초신성' | 'sn' )

우리는 단지 업데이트만으로 다시 쓰기 규칙을 변경할 수 있습니다 테이블:

별칭 업데이트
SET s = to_tsquery('초신성|sn & !성운')
어디서 t = to_tsquery('초신성');

SELECT ts_rewrite(to_tsquery('초신성 & 게'), 'SELECT * FROM 별칭');
                 ts_rewrite                  
--------------------------------
 '게' & ( '초신성' | 'sn' & !'성운' )

다시 쓰기 규칙이 많으면 다시 쓰기가 느려질 수 있습니다. 가능한 일치 여부에 대해 모든 규칙을 확인하기 때문입니다. 필터링하려면 명백한 비후보 규칙을 사용하여 격리를 사용할 수 있습니다. 에 대한 연산자tsquery유형. 에서 아래 예에서는 일치할 수 있는 규칙만 선택합니다. 원래 쿼리:

SELECT ts_rewrite('a & b'::tsquery,
                  'SELECT t,s FROM 별칭 WHERE ''a & b''::tsquery @ t');
 ts_rewrite
------------
 'b' & 'c'

12.4.3. 자동 트리거 업데이트

별도의 열을 사용하여 저장하는 경우ts벡터귀하의 문서를 표현한 것입니다. 업데이트하기 위해 트리거를 만드는 데 필요합니다.ts벡터문서 내용 열일 때 열 변화. 이를 위해 두 가지 내장 트리거 기능을 사용할 수 있습니다. 아니면 직접 작성할 수도 있습니다.

tsVector_update_trigger(tsVector_column_name, config_name, text_column_name [, ... ])
tsVector_update_trigger_column(tsVector_column_name, config_column_name, text_column_name [, ... ])

이러한 트리거 기능은 자동으로 다음을 계산합니다.ts벡터하나 이상의 텍스트 열에서 열, 에 지정된 매개변수의 제어 하에 있습니다.트리거 생성명령. 사용 예 다음과 같습니다:

CREATE TABLE 메시지(
    제목 텍스트,
    본문 텍스트,
    tsv ts벡터
);

삽입 또는 업데이트 전에 tsVectorupdate 트리거 생성
각 행 실행 절차에 대한 ON 메시지
tsVector_update_trigger(tsv, 'pg_catalog.english', 제목, 본문);

INSERT INTO message VALUES('제목은 여기에 있습니다', '본문은 여기에 있습니다');

SELECT * FROM 메시지;
   제목 |         몸 |            TSV             
------------+------------+----------------------------
 여기에 제목 | 본문 텍스트는 여기에 있습니다 | '보디':4 '텍스트':5 '제목':1

SELECT 제목, 본문 FROM 메시지 WHERE tsv @@ to_tsquery('title & body');
   제목 |         몸          
----------+------------
 여기에 제목 | 본문 텍스트는 여기에 있습니다

이 트리거를 생성한 후에는 다음 사항이 변경됩니다.제목또는자동으로 반영됩니다tsv, 애플리케이션이 걱정할 필요 없이 그것에 대해.

첫 번째 트리거 인수는 다음의 이름이어야 합니다.ts벡터업데이트할 열입니다. 두 번째 인수는 다음 작업에 사용할 텍스트 검색 구성을 지정합니다. 변환을 수행하십시오. 에 대한tsVector_update_trigger, 구성 이름은 단순히 두 번째 트리거 인수로 제공됩니다. 그래야만 해 위에 표시된 대로 스키마 정규화를 통해 트리거 동작이 변경 사항에 따라 변경되지 않습니다.검색_경로. 에 대한tsVector_update_trigger_column, 두 번째 트리거 인수는 다른 테이블 열의 이름입니다. 유형이어야 합니다.regconfig. 이는 다음을 허용합니다. 행별로 구성을 선택합니다. 남은 인수는 (유형의) 텍스트 열 이름입니다.텍스트, varchar또는문자). 이것들은 주어진 순서대로 문서를 작성하십시오. NULL 값은 건너뜁니다(그러나 다른 열은 계속해서 색인이 생성됩니다.)

이러한 내장 트리거의 한계는 다음을 처리한다는 것입니다. 모든 입력 열이 동일합니다. 열을 다르게 처리하려면 — 예를 들어 본문과 다르게 제목에 가중치를 부여하는 것은 사용자 정의 트리거를 작성하는 데 필요합니다. 다음은를 사용한 예입니다.PL/pgSQL트리거로 언어:

CREATE FUNCTION message_trigger() $$로 트리거를 반환합니다.
시작하다
  새로운.tsv :=
     setweight(to_tsVector('pg_catalog.english', coalesce(new.title,'')), 'A') ||
     setweight(to_tsVector('pg_catalog.english', coalesce(new.body,'')), 'D');
  새로운 것을 반환하십시오;
끝
$$ 언어 plpgsql;

삽입 또는 업데이트 전에 tsVectorupdate 트리거 생성
    각 행 실행 절차에 대한 ON 메시지 message_trigger();

다음을 지정하는 것이 중요하다는 점을 명심하십시오. 생성 시 명시적으로 구성 이름ts벡터트리거 내부의 값이므로 열의 내용은 변경사항에 영향을 받지 않습니다.default_text_search_config. 이를 수행하지 않음 검색결과가 변경되는 등의 문제가 발생할 가능성이 높습니다. 덤프하고 다시 로드한 후.

12.4.4. 문서 수집 통계

함수ts_stat유용해요 구성을 확인하고 불용어를 찾기 위해 후보자.

ts_stat(sqlquery 텍스트, [ 가중치 텍스트, ]
        아웃단어 텍스트, 아웃ndoc 정수,
        아웃넨트리 정수) 반환레코드 집합

sqlquery은 텍스트 값입니다. 단일을 반환해야 하는 SQL 쿼리가 포함되어 있습니다.ts벡터열.ts_stat쿼리를 실행하고 반환합니다. 에 포함된 각 개별 어휘소(단어)에 대한 통계ts벡터데이터. 반환된 열 이다

  • 단어 텍스트— 어휘소의 값

  • ndoc 정수— 문서 수(ts벡터s) 해당 단어는에서 발생했습니다.

  • 넨트리 정수— 총 발생 횟수 단어

만약가중치만 제공됩니다. 해당 가중치 중 하나를 갖는 발생이 계산됩니다.

예를 들어, 특정 항목에서 가장 자주 사용되는 10개의 단어를 찾으려면 문서 컬렉션:

SELECT * FROM ts_stat('아팟에서 벡터 선택')
ORDER BY nentry DESC, ndoc DESC, 단어
10개 제한;

동일하지만 가중치가 있는 단어 발생만 계산A또는B:

SELECT * FROM ts_stat('SELECT 벡터 FROM apod', 'ab')
ORDER BY nentry DESC, ndoc DESC, 단어
10개 제한;