롤 토토 : 문서 : 9.5 | |||
---|---|---|---|
PostgreSQL : 토토 사이트 : 9.5 : 텍스트 검색 제어 | 토토 사이트 추천 : 문서 : 9.5 : 전문 검색 | 12 장. 전문 검색 | PostgreSQL : 문서 : 9.5 : 배트맨 토토 |
이 섹션은 텍스트 검색과 관련하여 유용한 추가 토토 베이 및 연산자를 설명합니다.
섹션 12.3.1원시 텍스트 문서를 어떻게 변환 할 수 있는지 보여주었습니다.TSVECTOR값.토토 베이이미있는 문서를 조작하는 데 사용할 수있는 토토 베이 및 연산자를 제공합니다tsvector양식.
theTSVECTOR연결 연산자는 인수로 주어진 두 벡터의 Lexemes와 위치 정보를 결합한 벡터를 반환합니다. 위치 및 중량 라벨은 연결 중에 유지됩니다. 오른쪽 벡터에 나타나는 위치는 왼쪽 벡터에서 언급 된 가장 큰 위치에 의해 상쇄되므로 결과는 수행 결과와 거의 동일합니다to_tsvector
두 개의 원본 문화 문자열의 연결. (왼쪽 인수의 끝에서 제거 된 중지 단어는 결과에 영향을 미치지 않기 때문에 동등성은 정확하지 않습니다. 반면, 텍스트 관련성이 사용 된 경우 오른쪽 인수에서 Lexemes의 위치에 영향을 미쳤을 것입니다.).
적용하기 전에 텍스트를 연결하기보다는 벡터 형태의 연결을 사용하는 한 가지 장점to_tsvector
, 다른 구성을 사용하여 문서의 다른 섹션을 구문 분석 할 수 있습니다. 또한 때문에setweight
함수는 주어진 벡터의 모든 lexemes를 동일한 방식으로 표시합니다. 텍스트를 구문 분석하고 수행해야합니다setweight
문서의 다른 부분에 다른 가중치로 레이블을 지정하려는 경우 연결하기 전에.
setweight
모든 위치가 주어진 상태로 표시된 입력 벡터의 사본을 반환합니다웨이트, 어느a, B, C또는d. (d새 벡터의 기본값이며 출력에 표시되지 않습니다.)이 레이블은 벡터가 연결되면 유지되므로 토토 베이 순위에 따라 문서의 다른 부분의 단어가 다르게 가중 될 수 있습니다..
무게 라벨이 적용됨위치, 아님lexemes. 입력 벡터가 위치를 제거한 경우setweight
아무것도하지 않습니다.
벡터에 저장된 Lexemes의 수를 반환합니다.
주어진 벡터와 동일한 lexemes를 나열하지만 위치 또는 중량 정보가 부족한 벡터를 반환합니다. 반환 된 벡터는 관련성 순위를 위해 스트리핑되지 않은 벡터보다 훨씬 덜 유용하지만 일반적으로 훨씬 작습니다.
섹션 12.3.2원시 텍스트 쿼리를 어떻게 변환 할 수 있는지 보여주었습니다TSQUERY값.토토 베이이미있는 쿼리를 조작하는 데 사용할 수있는 함수 및 연산자를 제공합니다.TSQUERYForm.
주어진 쿼리의 두 가지를 반환합니다.
주어진 쿼리의 또는 전달을 반환합니다.
주어진 쿼리의 부정을 반환합니다.
A에서 노드 수 (Lexemes + 연산자)의 수를 반환합니다tsquery. 이 토토 베이은를 결정하는 데 유용합니다.쿼리는 의미가 있거나 (반환 0) 또는 중지 단어 만 포함합니다 (반환 0). 예 :
Numnode (Plainto_tsquery ( 'one'))를 선택합니다. 통지 : 쿼리에는 stopword 만 포함되거나 Lexeme (들)이 포함되어 있지 않습니다. Numnode ------- 0 numnode ( 'foo & bar':: tsquery)를 선택하십시오. Numnode ------- 3
A의 부분을 반환합니다tsquery인덱스 검색에 사용할 수 있습니다. 이 기능은 무시 할 수없는 쿼리, 예를 들어 중지 단어 만 포함하는 쿼리를 감지하는 데 유용합니다. 예를 들어:
select QueryTree (to_tsquery ( '! defined')); Querytree ----------
theTS_REWRITE
토토 베이 가족 검색 주어진tsquery대상 하위 쿼리의 발생에 대해서는 각 발생을 대체 하위 쿼리로 교체합니다. 본질적 으로이 작업은입니다.tsquery-특이 적 버전의 서브 스트링 교체. 대상과 대체 조합은 A로 생각할 수 있습니다.쿼리 rewrite RULE. 이러한 다시 쓰기 규칙의 모음은 강력한 검색 원조가 될 수 있습니다. 예를 들어, 동의어를 사용하여 검색을 확장 할 수 있습니다 (예 :New York, Big Apple, NYC, Gotham) 또는 검색을 좁히려면 사용자를 핫 주제로 안내합니다. 이 기능과 동의어 사전 사전 사이에는 기능이 중복됩니다 (섹션 12.6.4). 그러나, 당신은 다시 문지인없이 다시 쓰기 규칙 세트를 수정할 수 있지만, 동의어 사전을 업데이트하려면 reindexi토토 베이이 효과적이어야합니다.
이 형태의TS_REWRITE
단순히 단일 재 작성 규칙을 적용합니다 :대상대체어디에서나쿼리. 예를 들어:
TS_REWRITE ( 'A & B':: TSQUERY, 'A':: TSQUERY, 'C':: TSQUERY); ts_rewrite ------------ 'b'& 'c'
이 형태의TS_REWRITE
시작을 허용Query및 SQLselect명령은 텍스트 문자열로 제공됩니다. 그만큼select두 열의 열을 생산해야합니다tsquery타입. 의 각 행에 대해select결과, 첫 번째 열 값 (대상)의 발생은 전류 내에서 두 번째 열 값 (대체)으로 대체됩니다.쿼리값. 예를 들어:
테이블 별칭 생성 (t tsquery 기본 키, s tsquery); 별칭 값 ( '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'
별도의 열을 사용하여 저장할 때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. 이를 통해 양의 구성을 선택할 수 있습니다. 나머지 인수는 텍스트 열의 이름입니다 (유형텍스트, 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를 만듭니다 각 행에 대한 메시지에서 프로 시저 execute emsages_trigger ();
생성 할 때 구성 이름을 명시 적으로 지정하는 것이 중요하다는 것을 명심하십시오TSVECTOR트리거 내부의 값이므로 열 내용이 변경에 영향을받지 않도록default_text_search_config. 이렇게하지 않으면 덤프 및 재 장전 후 검색 결과가 변경되는 것과 같은 문제가 발생할 수 있습니다.
함수TS_STAT
구성을 확인하고 스톱 단어 후보를 찾는 데 유용합니다.
TS_STAT (sqlquery 텍스트, [ 웨이트 텍스트, ]
밖으로Word 텍스트, outndoc Integer,
밖으로Nentry Integer) 반환Setof Record
sqlquery단일을 반환 해야하는 SQL 쿼리가 포함 된 텍스트 값입니다.TSVECTOR열.TS_STAT
쿼리를 실행하고에 포함 된 각 고유 한 Lexeme (Word)에 대한 통계를 반환합니다TSVECTOR데이터. 반환 된 열은입니다.
Word 텍스트- Lexeme의 값
ndoc Integer- 문서 수 (TSVECTORs) 단어가 발생했습니다.
Nentry 정수- 단어의 총 발생 수
if웨이트공급되며, 그 중 하나를 갖는 발생 만 계산됩니다.
예를 들어, 문서 컬렉션에서 가장 빈번한 10 개의 단어를 찾으려면 :
선택 *에서 TS_STAT ( 'APOD에서 벡터 선택') Nentry Desc, Ndoc Desc, Word의 주문 제한 10;
동일하지만 무게로 단어 발생 만 세는 것a또는B:
ts_stat에서 * 선택 * ( 'APOD에서 벡터 선택', 'AB') Nentry Desc, Ndoc Desc, Word의 주문 제한 10;