| 윈 토토 : 문서 : 9.4 : 윈 토토 | |||
|---|---|---|---|
| PostgreSQL : 범퍼카 토토 : 9.4 : 텍스트 검색 제어 | 스포츠 토토 결과 : 문서 : 9.4 : 전문 검색 | 12장. 전체 텍스트 검색 | PostgreSQL : 문서 : 9.4 : 젠 토토 | 
이 섹션에서는 텍스트 검색과 관련하여 유용한 추가 스포츠 토토 및 연산자를 설명합니다.
섹션 12.3.1원시 텍스트 스포츠 토토를 어떻게 변환할 수 있는지 보여주었습니다.ts벡터값.포스트그레SQL또한 이미 있는 스포츠 토토를 조작하는 데 사용할 수 있는 함수와 연산자를 제공합니다.ts벡터양식.
그ts벡터연결 연산자는 인수로 제공된 두 벡터의 어휘소와 위치 정보를 결합한 벡터를 반환합니다. 위치와 중량 라벨은 연결 중에 유지됩니다. 오른쪽 벡터에 나타나는 위치는 왼쪽 벡터에 언급된 가장 큰 위치만큼 오프셋되어 있으므로 수행한 결과와 거의 동일합니다to_ts벡터두 원본 스포츠 토토 문자열의 연결에 대해. (왼쪽 인수의 끝에서 제거된 중지 단어는 결과에 영향을 미치지 않지만, 텍스트 연결이 사용된 경우 오른쪽 인수의 어휘소 위치에 영향을 주기 때문에 동등성은 정확하지 않습니다.)
적용하기 전에 텍스트를 연결하는 대신 벡터 형식으로 연결을 사용하는 이점 중 하나to_ts벡터, 다른 구성을 사용하여 스포츠 토토의 다른 섹션을 구문 분석할 수 있다는 것입니다. 또한, 왜냐하면설정중량함수는 주어진 벡터의 모든 어휘를 동일한 방식으로 표시합니다. 텍스트를 구문 분석하고 수행해야 합니다.설정중량스포츠 토토의 다른 부분에 다른 가중치를 부여하려면 연결하기 전에.
설정중량모든 위치에 주어진 라벨이 지정된 입력 벡터의 복사본을 반환합니다.무게, 둘 중 하나A, B, C, 또는D. (D은 새 벡터의 기본값이므로 출력에 표시되지 않습니다.) 이러한 레이블은 벡터가 연결될 때 유지되므로 스포츠 토토의 다른 부분에 있는 단어에 순위 함수에 따라 다르게 가중치를 부여할 수 있습니다.
무게 라벨이 다음에 적용된다는 점에 유의하세요.위치, 아님어휘. 입력 벡터의 위치가 제거된 경우설정중량아무것도 하지 않습니다.
벡터에 저장된 어휘소 수를 반환합니다.
주어진 벡터와 동일한 어휘소를 나열하지만 위치나 가중치 정보가 부족한 벡터를 반환합니다. 반환된 벡터는 관련성 순위에 있어서 제거되지 않은 벡터보다 훨씬 덜 유용하지만 일반적으로 훨씬 더 작습니다.
섹션 12.3.2원시 텍스트 쿼리를 다음으로 변환하는 방법을 보여주었습니다.tsquery값.스포츠 토토또한 이미 있는 쿼리를 조작하는 데 사용할 수 있는 함수와 연산자를 제공합니다.tsquery양식.
주어진 두 쿼리의 AND 조합을 반환합니다.
주어진 두 쿼리의 OR 조합을 반환합니다.
주어진 쿼리의 부정(NOT)을 반환합니다.
a의 노드 수(어휘소와 연산자)를 반환합니다.tsquery. 이 함수는 다음을 결정하는 데 유용합니다.질의의미가 있거나(0 0 반환) 중지 단어만 포함합니다(0 반환). 예:
SELECT numnode(plainto_tsquery('모든'));
주의사항: 쿼리에 불용어만 포함되어 있거나 어휘소가 포함되어 있지 않습니다. 무시됩니다.
 숫자 노드
---------
       0
SELECT numnode('foo & bar'::tsquery);
 숫자 노드
---------
       3a의 일부를 반환합니다.tsquery색인 검색에 사용할 수 있습니다. 이 함수는 색인화할 수 없는 쿼리(예: 불용어만 포함하거나 부정 용어만 포함하는 쿼리)를 검색하는 데 유용합니다. 예를 들면:
SELECT querytree(to_tsquery('!defined'));
 쿼리 트리
-----------그ts_rewrite함수군은 주어진 것을 검색합니다tsquery대상 하위 쿼리 발생에 대해 각 발생을 대체 하위 쿼리로 바꿉니다. 본질적으로 이 작업은 다음과 같습니다.tsquery부분 문자열 대체의 특정 버전입니다. 대상과 대체 조합은 다음과 같이 생각할 수 있습니다.쿼리 재작성 규칙. 이러한 재작성 규칙 모음은 강력한 검색 도구가 될 수 있습니다. 예를 들어 동의어를 사용하여 검색을 확장할 수 있습니다(예:뉴욕, 큰 사과, 뉴욕, 고담) 또는 검색 범위를 좁혀 사용자를 인기 있는 주제로 안내하세요. 이 스포츠 토토과 동의어 사전 사이에는 스포츠 토토상 일부 중복되는 부분이 있습니다(섹션 12.6.4). 그러나 재색인을 생성하지 않고도 즉시 재작성 규칙 집합을 수정할 수 있지만 동의어 사전을 업데이트하려면 재색인이 필요합니다.
이 형태는ts_rewrite단순히 단일 재작성 규칙을 적용합니다.대상다음으로 대체됨대체어디에나 나타나는지질의. 예를 들면:
SELECT ts_rewrite('a & b'::tsquery, 'a'::tsquery, 'c'::tsquery);
 ts_rewrite
------------
 'b' & 'c'이 형태는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'별도의 열을 사용하여 저장하는 경우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. 그렇지 않으면 덤프 및 다시 로드 후에 검색 결과가 변경되는 등의 문제가 발생할 수 있습니다.
함수ts_stat구성을 확인하고 불용어 후보를 찾는 데 유용합니다.
ts_stat(sqlquery 텍스트, [ 가중치 텍스트, ]
        아웃단어 텍스트, 아웃ndoc 정수,
        아웃넨트리 정수) 반환레코드 세트
sqlquery은 단일을 반환해야 하는 SQL 쿼리가 포함된 텍스트 값입니다.ts벡터열.ts_stat질의를 실행하고 다음에 포함된 각 개별 어휘소(단어)에 대한 통계를 반환합니다.ts벡터데이터. 반환된 열은 다음과 같습니다.
단어 텍스트— 어휘소의 값
ndoc 정수— 스포츠 토토 수(ts벡터s) 해당 단어는에서 발생했습니다.
넨트리 정수— 해당 단어의 총 발생 횟수
만약가중치이 제공되면 해당 가중치 중 하나를 갖는 발생만 계산됩니다.
예를 들어, 스포츠 토토 모음에서 가장 자주 사용되는 10개의 단어를 찾으려면:
SELECT * FROM ts_stat('SELECT 벡터 FROM apod')
ORDER BY nentry DESC, ndoc DESC, 단어
10개 제한;
동일하지만 가중치가 있는 단어 발생만 계산A또는B:
SELECT * FROM ts_stat('SELECT 벡터 FROM apod', 'ab')
ORDER BY nentry DESC, ndoc DESC, 단어
10개 제한;