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

12.3. 텍스트 검색 제어

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

12.3.1. 토토 사이트 구문 분석

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

to_tsvector ([ config RegConfig, ]토토 사이트 텍스트) 반환tsvector

to_tsvector텍스트 토토 사이트를 토큰으로 구문 분석하고, 토큰을 Lexemes로 줄이고, A를 반환합니다TSVECTOR토토 사이트의 위치와 함께 Lexemes를 나열합니다. 토토 사이트는 지정된 또는 기본 텍스트 검색 구성에 따라 처리됩니다. 간단한 예는 다음과 같습니다.

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

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

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

함수setweightA의 항목에 레이블을 지정하는 데 사용할 수 있습니다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');

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

12.3.2. 구문 분석 쿼리

postgresql함수 제공to_tsqueryandplainto_tsquery쿼리를 |tsquery데이터 유형.to_tsquery보다 더 많은 기능에 대한 액세스를 제공합니다Plainto_tsquery이지만 입력에 대해 덜 용서합니다.

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

to_tsquerya 생성tsqueryQueryText, 부울 연산자로 분리 된 단일 토큰으로 구성되어야합니다&(및),|(또는) 및!(아님). 이 연산자는 괄호를 사용하여 그룹화 할 수 있습니다. 다시 말해,에 대한 입력to_tsquery이미 일반 규칙을 따라야합니다TSQUERY입력,PostgreSQL : 문서 : 9.5 : 무지개 토토 검색 유형. 차이점은 기본적으로tsquery입력 토큰을 액면가로 가져옵니다.to_tsquery16560_16731

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_tsqueryAN 및 OR OR OR ORONTER에 의해 분리되지 않은 토큰에 대한 구문 오류가 생성됩니다.

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[, 정규화 정수]) returnsfloat4

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

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

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

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

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

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

if no웨이트제공되면 이러한 기본값이 사용됩니다.

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)를 순위로 선택하십시오
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

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

12.3.4. 결과 강조

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

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

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

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

  • Startsel, Stopsel: 토토 사이트에 나타나는 쿼리 단어를 구분하는 문자열은 다른 발췌 단어와 구별됩니다. 공백이나 쉼표가 포함 된 경우이 문자열을 두 배로 인용해야합니다.

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

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

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

  • maxfragments: 표시 할 최대 텍스트 발췌 또는 조각. 0의 기본값은 비 배양 지향 헤드 라인 생성 방법을 선택합니다. 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_HEADLINEa가 아닌 원본 토토 사이트를 사용합니다TSVECTOR요약이므로 느리게 진행될 수 있으며주의해서 사용해야합니다. 전형적인 실수는 전화하는 것입니다ts_headlineforEvery10 개의 토토 사이트 만 표시 될 때의 일치 토토 사이트.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;