12.3.텍스트 검색 제어

전체 텍스트 검색을 구현하려면 A를 만들 수있는 기능이 있어야합니다TSVECTOR토토 핫 및 A에서tsquery사용자 쿼리에서. 또한 결과를 유용한 순서로 반환해야하므로 토토 핫와 관련된 쿼리와 관련된 기능이 필요합니다.postgresql10359_10406

12.3.1.토토 핫 구문 분석

PostgreSQL함수 제공to_tsvector토토 핫를로 변환하려면TSVECTOR데이터 유형.

to_tsvector ([ config RegConfig,]Document 텍스트) 반환tsvector

to_tsvector텍스트 토토 핫를 토큰으로 구문 분석하고, 토큰을 렉시 메스로 줄이고, a를 반환합니다.TSVECTOR토토 핫의 위치와 함께 Lexemes를 나열합니다. 토토 핫는 지정된 또는 기본 텍스트 검색 구성에 따라 처리됩니다.

select to_tsvector ( '영어', '뚱뚱한 고양이는 매트에 앉아있었습니다 - 뚱뚱한 쥐를 먹었습니다.);

위의 예에서 결과tsvector단어가 포함되어 있지 않습니다a,on또는it, 단어rat및 문장 부호-무시되었습니다.

theto_tsvector함수는 내부적으로 토토 핫 텍스트를 토큰으로 나누고 각 토큰에 유형을 할당하는 파서를 내부적으로 호출합니다. 각 토큰에 대해 사전 목록 (PostgreSQL : 문서 : 15 : 12.6. 메이저 토토 사이트)는 토큰 유형에 따라 목록이 다를 수있는 곳에서 상담됩니다. 첫 번째 사전인식토큰은 하나 이상의 정규화 된를 방출합니다.Lexemes토큰을 나타냅니다. 예를 들어,rat사전 중 하나가 단어를 인식했기 때문에복수 형태의rat. 일부 단어는로 인식됩니다.단어 중지(섹션 12.6.1)는 검색에 너무 자주 발생하기 때문에 무시됩니다. 이 예에서는 이것들이a,onit. 목록의 사전이 토큰을 인식하지 않으면 무시됩니다.-실제로 토큰 유형에 할당 된 사전이 없기 때문에 (공간 기호) - 공간 토큰은 결코 색인되지 않습니다. 파서, 사전 및 색인 유형 유형의 선택은 선택한 텍스트 검색 구성 (에 의해 결정됩니다.섹션 12.7). 동일한 데이터베이스에 다양한 구성을 가질 수 있으며 다양한 언어에 대해 사전 정의 된 구성을 사용할 수 있습니다.영어영어의 경우.

함수setweighta의 항목에 레이블을 지정하는 데 사용할 수 있습니다.tsvector주어진웨이트, 무게가 문자 중 하나 인 곳a,B,C또는d. 이것은 일반적으로 제목 대 신체와 같은 토토 핫의 다른 부분에서 나오는 항목을 표시하는 데 사용됩니다.

왜냐하면to_tsvector(NULL) 복귀NULL, 사용하는 것이 좋습니다Coalesce필드가 null이 될 때마다. 다음은 a를 만드는 권장 방법입니다.TSVECTOR구조화 된 토토 핫에서 :

업데이트 tt set ti =

여기서 우리가 사용했습니다setweight완성 된 각 lexeme의 소스에 레이블을 지정하려면tsvectortsvectorTSVECTOR연결 연산자||. (섹션 12.4.1이 작업에 대한 세부 정보 제공.)

12.3.2.구문 분석 쿼리

PostgreSQL함수 제공to_tsquery,Plainto_tsquery,Phraseto_tsqueryandWebSearch_to_tsquery쿼리를 |tsquery데이터 유형.TO_TSQUERY어느 것보다 더 많은 기능에 대한 액세스를 제공합니다Plainto_tsquery또는Phraseto_tsquery, 그러나 입력에 대해 덜 용서합니다.WebSearch_to_tsquery단순화 된 버전의to_tsquery웹 검색 엔진에서 사용하는 것과 유사한 대체 구문이 포함되어 있습니다.

TO_TSQUERY ([ config RegConfig,]QueryText 텍스트) 반환TSQUERY

to_tsquerya 생성tsqueryQueryText.tsquery운영자&(및),|(또는),!(아님) 및<--(뒤에), 괄호를 사용하여 그룹화 될 수 있습니다. 다시 말해,에 대한 입력to_tsquery이미 일반 규칙을 따라야합니다tsquery입력, 설명대로섹션 8.11.2. 차이점은 기본적으로tsquery입력 토큰을 액면가로 가져옵니다.TO_TSQUERY지정된 또는 기본 구성을 사용하여 각 토큰을 Lexeme로 정규화하고 구성에 따라 중지 단어 인 모든 토큰을 버립니다. 예를 들어:

select to_tsquery ( '영어', '& fat & rats');

BASIC에서와 같이tsquery입력, 무게 (들)를 각 lexeme에 부착하여 일치하도록 제한 할 수 있습니다tsvector그 체중의 렉시 메스. 예를 들어:

select to_tsquery ( '영어', 'fat | rats : ab');

또한*접두사 매칭을 지정하기 위해 Lexeme에 부착 될 수 있습니다 :

select to_tsquery ( 'supern :*a & star : a*b');

그러한 lexeme은 a의 모든 단어와 일치합니다.TSVECTOR주어진 문자열로 시작합니다.

to_tsquery단일 인용 문구도 허용 할 수 있습니다. 이것은 구성에 이러한 문구에서 트리거 될 수있는 동의어 사전 사전이 포함 된 경우 주로 유용합니다.Supernovae Stars : SN:

select to_tsquery ( '' 'Supernovae Stars' '&! crab');

따옴표없이to_tsqueryAN 및 OR 또는 OPERATOR로 분리되지 않은 토큰에 대한 구문 오류가 발생합니다.

Plainto_tsquery ([ config RegConfig,]QueryText 텍스트) 반환tsquery

Plainto_tsquery형식화되지 않은 텍스트 변환QueryTextatsquery값. 텍스트는 구문 분석되고 정규화됩니다.to_tsvector, 그런 다음&(및)tsquery연산자가 살아남은 단어 사이에 삽입됩니다.

예 :

plainto_tsquery ( '영어', '뚱뚱한 쥐')를 선택하십시오.

참고Plainto_tsquery인식하지 못할 것입니다TSQUERY입력의 연산자, 무게 라벨 또는 접두사 매치 레이블 :

plainto_tsquery ( '영어', '지방 및 쥐 : c');

여기, 모든 입력 구두점이 폐기되었습니다.

Phraseto_tsquery ([ config RegConfig,]QueryText 텍스트) 반환tsquery

Phraseto_tsquery매우 동작Plainto_tsquery|<--(그 뒤에) 연산자는 대신 생존하는 단어 사이의 연산자&(및) 연산자. 또한 중지 단어는 단순히 버려지는 것이 아니라 삽입하여 설명합니다<n<--연산자. 이 기능은 정확한 Lexeme 시퀀스를 검색 할 때 유용합니다. 연산자가 렉서드 순서를 확인하기 때문에 모든 lexemes의 존재가 아니라 Lexeme 순서를 확인하기 때문입니다.

예 :

Select Phraseto_tsquery ( '영어', '뚱뚱한 쥐');

좋아요Plainto_tsquery, ThePhraseto_tsquery함수는 인식되지 않습니다TSQUERY입력의 연산자, 웨이트 레이블 또는 접두사 매치 레이블 :

Select Phraseto_tsquery ( '영어', '지방 및 쥐 : C');
WebSearch_to_tsquery ([ config RegConfig,]QueryText 텍스트) 반환TSQUERY

WEBSEARCH_TO_TSQUERYa 생성tsquery값에서QueryText간단한 형식화되지 않은 텍스트가 유효한 쿼리 인 대체 구문을 사용합니다. 같지 않은Plainto_tsqueryPhraseto_tsquery, 또한 특정 연산자도 인식합니다. 또한이 기능은 구문 오류가 발생하지 않으므로 검색에 원시 사용자가 제공하는 입력을 사용할 수 있습니다.

  • 인용되지 않은 텍스트: 텍스트 내부에없는 텍스트 인용 표시는에 의해 분리 된 용어로 변환됩니다&운영자, 마치 처리 된 것처럼Plainto_tsquery.

  • "인용문": 텍스트 내부의 텍스트는에 의해 분리 된 용어로 변환됩니다<--연산자, 마치 처리 된 것처럼Phraseto_tsquery.

  • 또는: 단어또는|운영자.

  • -: 대시가로 변환됩니다.!운영자.

다른 구두점은 무시됩니다. 그래서 좋아요Plainto_tsqueryandPhraseto_tsquery, TheWebSearch_to_tsquery함수는 인식되지 않습니다TSQUERY입력의 연산자, 무게 라벨 또는 접두사 매치 레이블.

예 :

Websearch_to_tsquery ( '영어', '뚱뚱한 쥐');

12.3.3.순위 검색 결과

순위 순위는 특정 토토 핫가 특정 쿼리와 관련된 방법을 측정하려고 시도하여, 많은 일치가있을 때 가장 관련성이 가장 좋은 내용을 먼저 표시 할 수 있습니다..PostgreSQL어휘, 근접성 및 구조 정보를 고려한 두 가지 사전 정의 된 순위 함수를 제공합니다. 즉, 토토 핫에 쿼리 용어가 얼마나 자주 나타나는지, 토토 핫에 용어가 얼마나 가까이 있는지, 그리고 토토 핫가 발생하는 곳의 일부가 얼마나 중요한지 고려합니다.

현재 사용 가능한 두 순위 기능은 다음과 같습니다.

TS_RANK ([웨이트 float4 [],]Vector TSVECTOR,쿼리 tsquery[,정규화 Integer]) returnsfloat4

일치하는 Lexemes의 빈도에 따라 벡터를 순위에 올랐습니다.

TS_RANK_CD ([웨이트 float4 [],]Vector TSVECTOR,쿼리 TSQUERY[,정규화 ​​Integer]) returnsfloat4

이 함수는를 계산합니다.커버 밀도Clarke, Cormack 및 Tudhope의 "Information Processing and Management", 1999의 저널의 "1 ~ 3 개의 쿼리에 대한 관련성 순위"에 설명 된 바와 같이 주어진 토토 핫 벡터 및 쿼리의 순위는와 유사합니다.TS_RANK렉서스와 일치하는 근접성이 서로 고려된다는 점을 제외하고 순위.

이 기능은 계산을 수행하기 위해 Lexeme 위치 정보가 필요합니다. 그러므로 그것은 어떤 것을 무시합니다스트리핑lexemes in theTSVECTOR. 입력에 쇄골이없는 Lexemes가 없으면 결과는 0이됩니다.섹션 12.4.1에 대한 자세한 내용은Strip함수 및 위치 정보TSVECTORs.)

이 기능 모두 선택 사항웨이트인수는 라벨이 붙은 방식에 따라 단어 인스턴스를 다소 크게 측정 할 수있는 능력을 제공합니다. 웨이트 어레이는 순서대로 각 단어 범주의 무게를 크게 측정하는 방법을 지정합니다.

D- 웨이트, C- 가이트, B- 가이트, A- 가이트

그렇지 않은 경우웨이트제공되면이 기본값이 사용됩니다.

0.1, 0.2, 0.4, 1.0

일반적으로 가중치는 제목이나 초기 초록과 같은 토토 핫의 특수 영역에서 단어를 표시하는 데 사용되므로 토토 핫 본문의 단어보다 다소 중요하게 취급 될 수 있습니다.

더 긴 토토 핫는 쿼리 용어를 포함 할 가능성이 더 높기 때문에 토토 핫 크기를 고려하는 것이 합리적입니다. 예를 들어 검색어의 5 가지 인스턴스가있는 백 단어 토토 핫는 5 개의 인스턴스가있는 천 단어 토토 핫보다 더 관련이있을 수 있습니다. 두 순위 기능 모두 정수를 취합니다정규화토토 핫의 길이가 순위에 영향을 미치는 지 여부와 방법을 지정하는 옵션. 정수 옵션은 몇 가지 동작을 제어하므로 약간의 마스크입니다.를 사용하여 하나 이상의 동작을 지정할 수 있습니다|(예 :2 | 4).

  • 0 (기본값)은 토토 핫 길이를 무시합니다

  • 1은 순위를 1 + 토토 핫 길이의 로그로 나눕니다

  • 2 토토 핫 길이로 순위를 나눕니다

  • 4 순위를 범위 사이의 평균 고조파 거리로 나눕니다 (이것은에 의해서만 구현됩니다TS_RANK_CD)

  • 8 토토 핫의 고유 단어 수로 순위를 나눕니다

  • 16은 순위를 1 + 토토 핫의 고유 단어 수의 로그를 1 +로 나눕니다

  • 32 자체로 순위를 나눕니다 + 1

두 개 이상의 플래그 비트가 지정되면 순서대로 변환이 적용됩니다..

순위 함수는 글로벌 정보를 사용하지 않으므로 때때로 원하는대로 1% 또는 100%로 공정한 정규화를 생성하는 것은 불가능합니다. 정규화 옵션 32 (RANK/(RANK+1))는 모든 순위를 범위 0에서 1로 확장하기 위해 적용될 수 있지만 물론 이것은 단지 미용적 변화 일뿐입니다. 검색 결과의 순서에는 영향을 미치지 않습니다.

여기 10 개의 가장 높은 순위 일치 만 선택하는 예는 다음과 같습니다.

계급을 선택, TS_RANK_CD (TEXTSEARCH, QUERY)로 순위로 선택하십시오

이것은 정규화 된 순위를 사용하는 것과 동일한 예입니다 :

계급 선택, TS_RANK_CD (TEXTSEARCH, QUERY, 32/ * RANK/(RANK+1) */)

순위는 컨설팅이 필요하기 때문에 비용이 많이들 수 있습니다TSVECTOR각각의 일치하는 토토 핫의 I/O 결합되어 느리게 할 수 있습니다. 불행히도, 실제 쿼리는 종종 많은 일치를 초래하기 때문에 피하는 것은 거의 불가능합니다.

12.3.4.결과 강조

검색 결과를 제시하려면 각 토토 핫의 일부를 표시하는 것이 이상적이며 쿼리와 관련된 방법. 일반적으로 검색 엔진은 검색어가 표시된 토토 핫 조각을 표시합니다.PostgreSQL함수 제공TS_HEADLINE이 기능을 구현합니다.

ts_headline ([ config RegConfig,]토토 핫 텍스트,쿼리 tsquery[,옵션 텍스트 ]) 반환텍스트

TS_HEADLINE쿼리와 함께 토토 핫를 수락하고 쿼리의 용어가 강조 표시되는 토토 핫에서 발췌문을 반환합니다. 토토 핫를 구문 분석하는 데 사용되는 구성은에 의해 지정할 수 있습니다.config; 만약에config생략,default_text_search_config구성이 사용됩니다.

IF an옵션String이 지정되어 있습니다. 하나 이상의 쉼표로 구분 된 목록으로 구성되어야합니다옵션=value쌍. 사용 가능한 옵션은 다음과 같습니다.

  • maxwords,minwords(정수) :이 숫자는 출력에 가장 길고 짧은 헤드 라인을 결정합니다. 기본값은 35와 15입니다.

  • Shortword(정수) :이 길이 이하의 단어는 쿼리 용어가 아닌 한 헤드 라인의 시작과 끝에서 삭제됩니다. 3의 기본값은 일반적인 영어 기사를 제거합니다.

  • 하이라이트(부울) : iftrue전체 토토 핫는 앞의 세 매개 변수를 무시하고 헤드 라인으로 사용됩니다. 기본값은거짓.

  • maxfragments(정수) : 표시 할 최대 텍스트 조각 수. 0의 기본값은 비 배제 기반 헤드 라인 생성 방법을 선택합니다.

  • Startsel,Stopsel(문자열) : 토토 핫에 표시되는 쿼리 단어를 구분하는 문자열은 다른 발췌 단어와 구별됩니다. 기본값은입니다.<band</b, HTML 출력에 적합 할 수 있습니다.

  • FragmentDelimiter(String) : 하나 이상의 조각이 표시되면 조각 이이 문자열로 분리됩니다. 기본값은....

이 옵션 이름은 사례에서 인식됩니다. 공백이나 쉼표가 포함 된 경우 문자열 값을 두 배로 인용해야합니다.

비 배제 헤드 라인 생성에서TS_HEADLINE주어진 일치를 찾습니다쿼리허용되는 헤드 라인 길이 내에 더 많은 쿼리 단어가있는 일치를 선호하는 단일 하나를 선택합니다. 조각 기반 헤드 라인 생성에서TS_HEADLINE쿼리 일치를 찾아 각 일치를 분할Fragmentsmaxwords각각 단어, 더 많은 쿼리 단어가있는 조각을 선호하고 가능하면스트레칭주변 단어를 포함하는 조각. 따라서 조각 기반 모드는 쿼리 일치가 토토 핫의 큰 섹션에 걸쳐 있거나 여러 일치를 표시하는 것이 바람직한 경우 더 유용합니다.minwords토토 핫의 단어가 표시됩니다.

예 :

ts_headline ( '영어',

TS_HEADLINEa가 아닌 원본 토토 핫를 사용합니다.TSVECTOR요약이므로 느리게 진행될 수 있고주의해서 사용해야합니다.

정정 제출

토토 핫에 올바른 것이 없으면 일치하지 않습니다.이 양식토토 핫 문제를보고하려면