이 토토 베이는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 보려고 할 수 있습니다PostgreSQL : 토토 베이 : 17 : 12.3. 텍스트 검색 제어버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

12.3. 텍토토 베이 검색 제어

전체 텍토토 베이 검색을 구현하려면 기능이 있어야합니다. a 만들기TSVECTOR토토 베이 및 A에서tsquery사용자 쿼리에서. 또한 우리는 필요합니다 유용한 순서로 결과를 반환하므로 기능이 필요합니다. 쿼리와 관련된 토토 베이를 비교합니다. 결과를 멋지게 표시하는 것도 중요합니다.postgresql지원을 제공합니다 이 모든 기능.

12.3.1. 구문 분석 서류

​​PostgreSQL제공 기능to_tsvector토토 베이를로 변환tsvector데이터 유형.

to_tsvector ([ config RegConfig, ]토토 베이 텍토토 베이) 반환TSVECTOR

to_tsvector텍토토 베이를 구문 분석합니다 토큰으로 토토 베이화하고, 토큰을 Lexemes로 줄입니다 a 반환TSVECTORLexemes는 토토 베이의 위치와 함께합니다. 그만큼 토토 베이는 지정된 또는 기본값에 따라 처리됩니다 텍토토 베이 검색 구성. 간단한 예는 다음과 같습니다.

select to_tsvector ( '영어', '뚱뚱한 고양이는 매트에 앉아 있습니다 - 뚱뚱한 쥐를 먹었습니다.);
                  to_tsvector
----------------------------------------------------------------------
 'Ate': 9 'cat': 3 'fat': 2,11 'mat': 7 '쥐': 12 'sat': 4

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

theto_tsvector함수 내부적으로 토토 베이 텍토토 베이를 각 토큰에 유형을 토큰하고 할당합니다. 각 토큰에 대해 목록 사전 (토토 PostgreSQL)가 상담되며,이 목록은 토큰 유형. 첫 번째 사전인식토큰은 하나 이상을 방출합니다 정규화lexemes토큰. 예를 들어,rat사전 중 하나 때문입니다 단어를 인식했다is 복수 형태rat. 어떤 단어는 로 인정단어 중지(섹션 12.6.1), 이로 인해 발생하면 무시됩니다. 검색에 유용하기에는 너무 자주. 이 예에서는 이것들입니다 이다a, on, 그리고it. 목록에 사전이없는 경우 토큰을 인식 한 다음 무시됩니다. 이 예에서 문장 부호에 일어난 일-실제로 사전이 없기 때문입니다 토큰 유형에 할당 (공간 기호), 공간 토큰은 결코 색인되지 않습니다. 그만큼 파서, 사전 선택 및 어떤 유형의 토큰 인덱스는 선택한 텍토토 베이 검색 구성에 의해 결정됩니다 (PostgreSQL : 문서 : 9.0 : 토토 예). 그것 동일하게 다양한 구성을 가질 수 있습니다. 데이터베이스 및 사전 정의 된 구성을 사용할 수 있습니다 다양한 언어. 이 예에서는 기본값을 사용했습니다 구성영어영어 언어.

함수setweight할 수 있습니다 a의 레이블을 지정하는 데 사용됩니다.TSVECTOR웨이트편지 중 하나a, B, C또는d. 이것은 일반적으로 항목을 표시하는 데 사용됩니다 제목 대 신체와 같은 토토 베이의 다른 부분에서. 나중에이 정보는 검색 순위에 사용될 수 있습니다. 결과.

왜냐하면to_tsvector(NULL) 복귀NULL, 사용하는 것이 좋습니다Coalesce필드가 널이 될 때마다. 권장 방법은 다음과 같습니다 A 생성TSVECTOR구조화 된 토토 베이:

업데이트 tt set ti =
    setweight (to_tsvector (Coalesce (title, '')), 'a') ||
    setweight (to_tsvector (Coalesce (키워드, ''), 'b') ||
    setweight (to_tsvector (Coalesce (Abstract, '')), 'c') ||
    setweight (to_tsvector (Coalesce (body, '')), 'd');

여기서 우리가 사용했습니다setweightto 완성 된 각 lexeme의 소스에 라벨을 붙입니다TSVECTORTSVECTORtsvector연결 연산자||. (섹션 12.4.1이러한 작업에 대한 세부 정보 제공.)

12.3.2. 구문 분석 쿼리

PostgreSQL제공 기능to_tsqueryandPlainto_tsquery변환 용 a 쿼리tsquery데이터 유형.to_tsquery더 많은 액세스를 제공합니다 보다 특징Plainto_tsquery, 그러나 입력에 대해 덜 용서합니다.

to_tsquery ([ config RegConfig, ]QueryText 텍토토 베이) 반환TSQUERY

TO_TSQUERYa 생성tsqueryQueryText는 단일로 구성되어야합니다 부울 운영자에 의해 분리 된 토큰&(및),|(또는) 및!(아님). 이 운영자는 될 수 있습니다 괄호를 사용하여 그룹화되었습니다. 다시 말해,에 대한 입력to_tsquery이미 따라야합니다 에 대한 일반적인 규칙TSQUERY입력, AS 설명PostgreSQL :. 차이점은 기본적으로TSQUERY입력 토큰을 액면가로 가져옵니다.to_tsquery각 토큰을 정상화합니다 지정된 또는 기본 구성을 사용하여 Lexeme에 에 따라 중지 단어 인 토큰을 폐기합니다. 구성. 예를 들어:

select to_tsquery ( '영어', '& fat & rats');
  to_tsquery   
-----------------
 '지방'& '쥐'

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

select to_tsquery ( '영어', 'fat | rats : ab');
    to_tsquery    
-----------------
 '지방'| '랫트': ab

또한*lexeme에 첨부 할 수 있습니다 접두사 매칭을 지정하려면 :

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

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

to_tsquery수락 할 수 있습니다 단일 인용구. 이것은 주로 유용합니다 구성에는 트리거 될 수있는 동의어 사전이 포함되어 있습니다 그러한 문구에. 아래의 예에서, 동의어 사전에는 다음을 포함합니다 규칙Supernovae Stars : SN:

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

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

Plainto_tsquery ([ config RegConfig, ]QueryText 텍토토 베이) 반환tsquery

Plainto_tsquery변환 형식화되지 않은 텍토토 베이QueryTexttotsquery. 텍토토 베이는 구문 분석됩니다 와 마찬가지로 정규화to_tsvector, 그런 다음&(및) 부울 연산자가 삽입됩니다 살아남은 단어.

예 :

plainto_tsquery ( '영어', '뚱뚱한 쥐');
 Plainto_tsquery 
------------------
 '지방'& '쥐'

참고Plainto_tsquery부울 연산자, 체중 레이블을 인식 할 수 없습니다 입력의 접두사 매치 레이블 :

Plainto_tsquery ( '영어', '지방 및 쥐 : C');
   Plainto_tsquery   
--------------------
 '지방'& '쥐'& 'c'

여기, 모든 입력 구두점은 공간으로 폐기되었습니다. 기호.

12.3.3. 순위 검색 결과

순위가 관련 토토 베이가 어떻게 관련되어 있는지 측정하려는 시도 많은 쿼리, 많은 사람들이 가장 일치 할 때 관련 항목은 먼저 표시 될 수 있습니다.PostgreSQL두 개의 사전 정의 된 순위를 제공합니다 어휘, 근접성 및 구조 정보; 즉, 그들은 얼마나 자주 고려합니다 토토 베이에 쿼리 용어가 나타납니다. 용어는 토토 베이에 있으며 그들이 어디에서 발생하는지 토토 베이화하십시오. 그러나 관련성의 개념은 다음과 같습니다 모호하고 매우 적용 특정. 다른 응용 프로그램 순위에 대한 추가 정보가 필요할 수 있습니다 (예 : 토토 베이 수정 시간. 내장 순위 기능은 다음과 같습니다 예제 만. 자신의 순위 기능을 작성할 수 있습니다 결과를 추가 요인과 결합하여 귀하에게 적합합니다 특정 요구.

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

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

표준 순위 기능.

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

이 함수는를 계산합니다.표지 밀도지정된 토토 베이 벡터에 대한 순위 Clarke, Cormack 및 Tudhope 's에 설명 된대로 쿼리 "1 ~ 3 개의 용기 쿼리에 대한 관련성 순위"에서 저널 "정보 처리 및 관리", 1999.

이 기능은 위치 정보가 필요합니다 입력. 따라서 작동하지 않습니다"토토 베이리핑" TSVECTOR값 - 항상 0을 반환합니다.

이 기능 모두 선택 사항웨이트인수는 능력을 제공합니다 단어 인스턴스가 어떻게 무게를 측정하는지에 따라 레이블이 붙어 있습니다. 무게 어레이는 무게가 얼마나 크게 얼마나 많은지를 지정합니다 순서대로 각 단어 범주 :

D- 중등도, C- 가이트, B- 가이트, A- 가이트

NO웨이트제공됩니다. 그러면 이러한 기본값이 사용됩니다.

0.1, 0.2, 0.4, 1.0

일반적으로 가중치는 특수 영역에서 단어를 표시하는 데 사용됩니다. 제목이나 초기 초록과 같은 토토 베이의 단어보다 더 중요하거나 덜 중요하게 취급 할 수 있습니다. 토토 베이 바디.

더 긴 토토 베이는 쿼리 용어 토토 베이 크기를 고려하는 것이 합리적입니다. 예를 들어, 5 개의 검색 인스턴스가있는 백 단어 토토 베이 단어는 아마도 천 단어 토토 베이보다 더 관련이있을 것입니다 5 개의 인스턴스가 있습니다. 두 순위 기능 모두 정수를 취합니다정규화옵션 토토 베이의 길이가 그 영향에 어떤 영향을 미치는지 여부를 지정합니다. 계급. 정수 옵션은 몇 가지 동작을 제어하므로 비트 마스크 :를 사용하여 하나 이상의 동작을 지정할 수 있습니다|(예 :2|4).

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

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

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

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

  • 8 순위를 고유 한 단어의 수로 나눕니다. 토토 베이

  • 16 순위를 1 + 숫자의 로그로 나눕니다. 토토 베이의 독특한 단어

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

둘 이상의 플래그 비트가 지정되면 변환 나열된 순서로 적용됩니다.

순위 함수는 그렇지 않다는 점에 유의해야합니다. 글로벌 정보를 사용하므로 때때로 원하는대로 1% 또는 100%로 공정한 정규화. 정규화 옵션 32 (RANK/(RANK+1))는 모든 순위를 확장하기 위해 적용 할 수 있습니다 0에서 1까지 범위로, 물론 이것은 단지 미용 적 변화; 검색 순서에는 영향을 미치지 않습니다 결과.

여기에 가장 높은 순위 만 선택하는 예는 다음과 같습니다. 성냥:

제목을 선택하여 TS_RANK_CD (TEXTSEARCH, QUERY)를 순위로 선택합니다
Apod에서 To_tsquery ( 'Neutrino | (Dark & ​​Matter)') 쿼리
query @@ textsearch
RANK DESC의 주문
제한 10;
                     제목 |   계급
-------------------------------------------------------------------
 태양의 중성미자 |      3.1
 Sudbury Neutrino Detector |      2.4
 은하의 암흑 물질의 사나이보기 |  2.01317
 뜨거운 가스와 암흑 물질 |  1.91171
 처녀 자리 클러스터 : 뜨거운 혈장과 암흑 물질 |  1.90953
 태양 중성미자 래프팅 |      1.9
 NGC 4650A : 이상한 은하와 암흑 물질 |  1.85774
 뜨거운 가스와 암흑 물질 |   1.6123
 우주 중성미자를위한 얼음 낚시 |      1.6
 약한 렌즈는 우주를 왜곡합니다 | 0.818218

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

제목 선택, TS_RANK_CD (TEXTSEARCH, QUERY, 32/ * RANK/(RANK+1) */)
Apod에서 To_tsquery ( 'Neutrino | (Dark & ​​Matter)') 쿼리
query @@ textsearch
RANK DESC의 주문
제한 10;
                     제목 |        계급
-----------------------------------------------------------------------------
 태양의 중성미자 | 0.756097569485493
 Sudbury Neutrino Detector | 0.705882361190954
 은하의 암흑 물질의 사나이보기 | 0.668123210574724
 뜨거운 가스와 암흑 물질 |  0.65655958650282
 처녀 자리 클러스터 : 뜨거운 혈장과 암흑 물질 | 0.656301290640973
 태양 중성미자 래프팅 | 0.65172410958162
 NGC 4650A : 이상한 은하와 암흑 물질 | 0.650072921219637
 뜨거운 가스와 암흑 물질 | 0.617195790024749
 우주 중성미자를위한 얼음 낚시 | 0.615384618911517
 약한 렌즈는 우주를 왜곡합니다 | 0.450010798361481

순위는 컨설팅이 필요하기 때문에 비용이 많이들 수 있습니다TSVECTOR27960_28158

12.3.4. 결과 강조

검색 결과를 제시하려면 각각의 일부를 보여주는 것이 이상적입니다. 토토 베이 및 쿼리와 관련된 방법. 일반적으로 검색 엔진은 검색 된 검색으로 토토 베이 조각을 보여줍니다 자귀.PostgreSQL제공 a 기능ts_headline이 기능을 구현합니다.

ts_headline ([ config RegConfig, ]토토 베이 텍토토 베이, 쿼리 TSQUERY[, 옵션 텍토토 베이 ]) returns텍토토 베이

TS_HEADLINE토토 베이를 수락합니다 쿼리와 함께 토토 베이에서 발췌 한 내용을 반환합니다. 쿼리에서 어떤 용어가 강조 표시됩니다. 구성 토토 베이를 구문 분석하는 데 사용하려면 토토 베이를 지정할 수 있습니다.config; 만약에config생략,default_text_search_config구성입니다 사용된.

IF an옵션문자열은 지정된 쉼표로 구분 된 쉼표로 구성되어야합니다. 더옵션=29799_29806쌍. 사용 가능한 옵션은 다음과 같습니다.

  • Startsel, Stopsel: 구분할 문자열 토토 베이에 표시되는 쿼리 단어를 구별합니다 다른 발췌 한 단어에서. 이것들을 두 배로 늘려야합니다 공백이나 쉼표가 포함 된 경우 줄.

  • maxwords, minwords:이 숫자를 결정합니다 출력에 가장 길고 가장 짧은 헤드 라인.

  • Shortword:이 길이의 단어 헤드 라인의 시작과 끝에서 삭제됩니다. 3의 기본값은 일반적인 영어를 제거합니다 조항.

  • 하이라이트: 부울 플래그; 만약에true전체 토토 베이가 있습니다 앞의 3을 무시하고 헤드 라인으로 사용됩니다 매개 변수.

  • maxfragments: 최대 수 표시 할 텍토토 베이 발췌 또는 파편. 기본값 Zero는 비 배양 지향 헤드 라인 생성을 선택합니다 방법. 0보다 큰 값은 조각 기반을 선택합니다 헤드 라인 생성. 이 방법은 텍토토 베이 조각을 찾습니다 가능한 한 많은 쿼리 단어와 그 단어를 늘립니다 쿼리 단어 주위의 조각. 결과적으로 쿼리 단어 각 조각의 중간에 가깝고 단어가 있습니다. 각면. 각 조각은 최대입니다Maxwords및 길이의 단어Shortword이하는 시작시 삭제됩니다 각 조각의 끝. 모든 쿼리 단어를 찾은 것은 아닙니다 토토 베이에서 첫 번째 조각의 단일 조각minwords토토 베이에서 표시.

  • FragmentDelimiter: 더 많은 경우 하나의 조각이 표시되는 것보다 조각이 표시됩니다 이 문자열로 분리.

지정되지 않은 옵션은 다음 기본값을받습니다 :

startsel = <b, stopsel = </b,
maxwords = 35, minwords = 15, shortword = 3, highlightall = false,
maxfragments = 0, fragmentDelimiter = "..."

예 :

ts_headline ( '영어',
  '가장 일반적인 유형의 검색
주어진 쿼리 용어가 포함 된 모든 토토 베이를 찾는 것입니다
그리고 그들과 유사하게 반환하십시오.
질문.',
  to_tsquery ( '쿼리 및 유사성');
                        ts_headline                         
-------------------------------------------------------------------
 주어진 <b query </b 용어를 포함합니다
 <b 유사성 </b의 순서대로 반환하십시오.
 <b 쿼리 </b.

선택 ts_headline ( '영어',
  '가장 일반적인 유형의 검색
주어진 쿼리 용어가 포함 된 모든 토토 베이를 찾는 것입니다
그리고 그들과 유사하게 반환하십시오.
질문.',
  to_tsquery ( '쿼리 및 유사성'),
  'startsel = <, stopsel =');
                      ts_headline                      
---------------------------------------------------------------------
 주어진 <query 용어를 포함합니다
 <유사성 순서대로 반환하십시오.
 <query.

TS_HEADLINE원본을 사용합니다 토토 베이, ATSVECTOR요약 느리게 할 수 있으며주의해서 사용해야합니다. 전형적인 실수는입니다 전화하려면TS_HEADLINEforEvery일치 10 개의 토토 베이 만 표시 될 때 토토 베이화합니다.SQL하위 쿼리가 도움이 될 수 있습니다. 예는 다음과 같습니다.

id, ts_headline (body, q), 순위를 선택하십시오
From (SELECT ID, BODY, Q, TS_RANK_CD (TI, Q)를 순위로
      Apod에서, to_tsquery ( 'stars') q
      여기서 ti @@ q
      RANK DESC의 주문
      제한 10) foo;