이 윈 토토는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다PostgreSQL : 윈 토토 커뮤니티 : 17 : 12.1. 소개버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

12.1. 소개#

전체 텍스트 검색 (또는 Just텍스트 검색) 자연 언어를 식별하는 능력을 제공합니다윈 토토만족쿼리, 그리고 선택적으로 쿼리와 관련하여 정렬합니다. 가장 일반적인 검색 유형은 주어진 모든 윈 토토를 찾는 것입니다쿼리 용어순서대로 반환유사성쿼리에. 개념쿼리and유사성는 매우 유연하며 특정 응용 프로그램에 따라 다릅니다. 가장 간단한 검색은쿼리단어 세트와유사성윈 토토의 쿼리 단어의 빈도로.

텍스트 검색 연산자는 수년간 데이터베이스에 존재했습니다.PostgreSQLhas~, ~*, 좋아요ilike텍스트 데이터 유형의 운영자이지만 현대 정보 시스템에 필요한 많은 필수 속성이 부족합니다.

  • 영어조차도 언어 적 지원이 없습니다. 정규 표현은 파생 된 단어 (예 :를 쉽게 처리 할 수 없기 때문에 충분하지 않습니다.만족and만족. 포함 된 윈 토토를 놓칠 수 있습니다만족, 그래도 검색 할 때 그들을 찾고 싶지만만족. 사용할 수 있습니다또는여러 파생 양식을 검색하려면 지루하고 오류가 발생하기 쉽습니다 (일부 단어는 수천 개의 파생물을 가질 수 있습니다).

  • 검색 결과의 주문 (순위)을 제공하지 않으므로 수천 개의 일치하는 윈 토토가 발견 될 때 효과가 없습니다.

  • 색인 지원이 없기 때문에 느리게하는 경향이 있으므로 모든 검색에 대해 모든 윈 토토를 처리해야합니다..

전체 텍스트 인덱싱 윈 토토를 허용합니다전처리그리고 나중에 빠른 검색을 위해 저장된 색인. 전처리 포함 :

  • 구문 분석 윈 토토로토큰. 예를 들어 숫자, 단어, 복잡한 단어, 이메일 주소와 같은 다양한 클래스의 토큰을 식별하여 다르게 처리 할 수 있습니다. 원칙적으로 토큰 클래스는 특정 응용 프로그램에 의존하지만 대부분의 목적 상 사전 정의 된 클래스 세트를 사용하는 것이 적절합니다.PostgreSQLa 사용파서이 단계를 수행하려면. 표준 파서가 제공되며 특정 요구를 위해 맞춤형 파서를 만들 수 있습니다.

  • 토큰 변환Lexemes. Lexeme은 토큰처럼 끈이지만정규화동일한 단어의 다른 형태가 비슷하게 만들어집니다. 예를 들어, 정규화는 거의 항상 항상 하위 신호한 문자를 접는 것이 포함되며 종종 접미사 제거를 포함합니다 (예 :S또는es영어). 이를 통해 검색은 가능한 모든 변형을 지식으로 입력하지 않고도 동일한 단어의 변형 형식을 찾을 수 있습니다. 또한이 단계는 일반적으로 제거합니다단어 중지, 이것은 너무 흔한 단어로서 검색에 쓸모가 없습니다. (요컨대, 토큰은 윈 토토 텍스트의 원시 조각이며, Lexemes는 색인 및 검색에 유용한 단어입니다.)postgresql용도Dictionaries이 단계를 수행하려면. 다양한 표준 사전이 제공되며 특정 요구에 맞는 맞춤형 사전을 만들 수 있습니다.

  • 검색에 최적화 된 전처리 윈 토토 저장. 예를 들어, 각 윈 토토는 정규화 된 Lexemes의 정렬 된 배열로 표시 될 수 있습니다. Lexemes와 함께 사용하기 위해 사용할 위치 정보를 저장하는 것이 종종 바람직합니다근접 순위, 더 많은 것을 포함하는 윈 토토조밀 한쿼리 단어의 영역은 쿼리 단어가 흩어져있는 것보다 높은 순위가 할당됩니다.

사전은 토큰이 정규화되는 방법에 대한 세밀한 제어를 허용합니다. 적절한 사전을 사용하면 다음과 같이 할 수 있습니다.

  • 색인을 작성해서는 안되는 중지 단어 정의.

  • 동의어를 한 단어로 맵핑하여Ispell.

  • 동의어 사전을 사용하여 단일 단어에 대한 문구를 맵핑하십시오.

  • an을 사용하여 단어의 다른 변형을 표준 형태로 매핑합니다Ispell사전.

  • 단어의 다른 변형을 사용하여 표준 형태로 매핑SnowballStemmer Rules.

데이터 유형TSVECTOR유형과 함께 전처리 된 윈 토토를 저장할 수 있도록 제공됩니다TSQUERY처리 된 쿼리를 나타내는 경우 (PostgreSQL : 문서 : 18 : 8.11. 윈 토토 윈 토토 유형). 이러한 데이터 유형에 사용할 수있는 많은 기능과 연산자가 있습니다 (PostgreSQL : 문서 : 18 : 9.13. 스포츠 토토 결과 검색 기능 및 연산자), 가장 중요한 것은 경기 연산자입니다@@, 우리가 소개하는섹션 12.1.2. 인덱스를 사용하여 전체 텍스트 검색을 가속화 할 수 있습니다 (PostgreSQL : 문서 : 18 : 12.9. 텍스트 검색을위한 우선 토토 베이 유형).

12.1.1. 윈 토토 란 무엇입니까?#

aDocument전체 텍스트 검색 시스템에서 검색 단위입니다. 예를 들어, 잡지 기사 또는 이메일 메시지. 텍스트 검색 엔진은 Lexemes (키워드)의 윈 토토를 구문 분석하고 상위 윈 토토와 함께 저장할 수 있어야합니다. 나중에이 협회는 쿼리 단어가 포함 된 윈 토토를 검색하는 데 사용됩니다.

내 검색PostgreSQL, 윈 토토는 일반적으로 데이터베이스 테이블 행 내의 텍스트 필드 또는 아마도 여러 테이블에 저장되거나 동적으로 얻은 해당 필드의 조합 (연결)입니다. 다시 말해, 윈 토토는 인덱싱을 위해 다른 부품에서 구성 될 수 있으며 전체적으로 어디서나 저장되지 않을 수 있습니다. 예를 들어:

제목 선택 || ''||  저자 || ''||  초록 || ''|| 윈 토토로서의 몸
메시지에서
여기서 Mid = 12;

M.Title ||를 선택하십시오 ''|| M.Author || ''|| M.AbStract || ''|| D. 윈 토토로서
메시지 m, 윈 토토 d
여기서 m.mid = d.did 및 m.mid = 12;

Note

실제로,이 예제에서 쿼리Coalesce단일을 방지하는 데 사용해야합니다NULLa를 일으키는 속성NULL전체 윈 토토의 결과.

또 다른 가능성은 윈 토토를 파일 시스템에 간단한 텍스트 파일로 저장하는 것입니다. 이 경우 데이터베이스는 전문가 인덱스를 저장하고 검색을 실행하는 데 사용될 수 있으며 일부 고유 식별자를 사용하여 파일 시스템에서 윈 토토를 검색 할 수 있습니다. 그러나 데이터베이스 외부에서 파일을 검색하려면 Superuser 권한 또는 특수 기능 지원이 필요하므로 모든 데이터를 내부에 두는 것보다 편리하지 않습니다.PostgreSQL. 또한 데이터베이스 내부에 모든 것을 유지하면 윈 토토 메타 데이터에 쉽게 액세스 할 수있어 인덱싱 및 디스플레이를 지원합니다.

텍스트 검색 목적의 경우 각 윈 토토를 전처리로 줄여야합니다tsvector형식. 검색 및 순위는 전적으로에서 수행됩니다.TSVECTOR윈 토토 표현 - 원본 텍스트는 사용자에게 표시하도록 윈 토토를 선택한 경우에만 검색해야합니다. 그러므로 우리는 종종에 대해 이야기합니다.TSVECTOR윈 토토로서, 물론 전체 윈 토토의 작품 일뿐입니다.

12.1.2. 기본 텍스트 일치#

전체 텍스트 검색에서postgresql매치 연산자를 기반으로@@, 반환trueif aTSVECTOR(윈 토토) 일치 atsquery(쿼리). 어떤 데이터 유형이 먼저 기록되었는지는 중요하지 않습니다.

'뚱뚱한 고양이가 매트에 앉아 뚱뚱한 쥐를 먹었다':: tsvector @@ 'cat & rat':: tsquery;
 ?열?
---------
 티

'fat & cow':: tsquery @@ '뚱뚱한 고양이가 매트에 앉아 뚱뚱한 쥐를 먹었다':: tsvector;
 ?열?
---------
 에프

위의 예에서 알 수 있듯이 ATSQUERY단순한 텍스트가 아니라TSVECTORis. 에이tsquery는 이미 정규화되어야하는 검색어를 포함하고 있으며, 사용 및 사용되지 않음, 그 뒤에 운영자를 사용하여 여러 용어를 결합 할 수 있습니다. (구문 세부 사항은 참조)섹션 8.11.2.) 기능이 있습니다TO_TSQUERY, Plainto_tsqueryPhraseto_tsquery사용자가 작성한 텍스트를 적절한 것으로 변환하는 데 도움이되는TSQUERY, 주로 텍스트에 나타나는 단어를 정규화함으로써. 비슷하게,to_tsvector문자열을 구문 분석하고 정규화하는 데 사용됩니다. 실제로 텍스트 검색 경기는 다음과 같습니다.

to_tsvector ( 'Fat Cats Ate Fat Rats') @@ to_tsquery ( 'Fat & Rat');
 ?열?
---------
 티

|

'Fat Cats Ate Fat Rats':: tsvector @@ to_tsquery ( 'Fat & Rat');
 ?열?
---------
 에프

여기서 단어의 정규화가 없으므로발생합니다. A의 요소TSVECTORLexemes는 이미 정규화되었다고 가정하므로일치하지 않습니다rat.

the@@운영자도 지원텍스트입력, 텍스트 문자열을 명시 적으로 변환 할 수 있습니다TSVECTOR또는TSQUERY간단한 경우에 건너 뜁니다. 사용 가능한 변형은 다음과 같습니다.

tsvector @@ tsquery
tsquery @@ tsvector
텍스트 @@ tsquery
텍스트 @@ 텍스트

우리가 이미 본 첫 번째 두 가지. 양식텍스트 @@ TSQUERY와 동일합니다to_tsvector (x) @@ y. 양식텍스트 @@ 텍스트to_tsvector (x) @@ plainto_tsquery (y).

a 내TSQUERY, The&(및) 운영자는 윈 토토에 두 개의 인수가 나타나야한다고 지정합니다. 마찬가지로|(또는) 운영자는 적어도 하나의 인수가 나타나야한다고 지정하고!(NOT) 운영자는 해당 주장이 있어야한다고 지정합니다아님일치하기 위해 나타납니다. 예를 들어, 쿼리Fat &! 쥐포함 된 윈 토토와 일치지방하지만rat.

문구 검색이 가능합니다.<--(뒤 따르는)TSQUERY연산자, 인수가 인접하고 주어진 순서로 일치하는 경우에만 일치합니다. 예를 들어:

select to_tsvector ( 'fatal error') @@ to_tsquery ( 'fatal <- 오류');
 ?열?
---------
 티

선택 to_tsvector ( '오류는 치명적이지 않음') @@ to_tsquery ( 'fatal <- 오류');
 ?열?
---------
 에프

양식을 갖는 연산자가 더 일반적인 버전이 있습니다<n, 여기n일치하는 Lexemes의 위치 사이의 차이점에 대한 정수입니다.<1<--, while<2매치 사이에 정확히 다른 lexeme가 나타나도록 허용합니다. 그만큼Phraseto_tsquery함수는이 연산자를 사용하여 a를 구성합니다.tsquery일부 단어가 중지 된 단어 일 때 다중 단어 문구와 일치 할 수 있습니다. 예를 들어:

Select Phraseto_tsquery ( '고양이는 쥐를 먹었다');
       Phraseto_tsquery
-------------------------------------
 '고양이'<- 'ate'<- '쥐'

phraseto_tsquery ( '고양이는 쥐를 먹었다');
       Phraseto_tsquery
-------------------------------------
 '고양이'<-- 'ate'<2 '쥐'

때때로 유용한 특별한 경우는입니다.<0두 패턴이 같은 단어와 일치하도록 요구할 수 있습니다.

괄호로 사용하여 중첩을 제어 할 수 있습니다tsquery운영자. 괄호없이|최소 단단하게 바인딩 한 다음&, 그때<--!가장 단단히.

운영자가 작동하지 않을 때보 다 연산자의 인수 내에있을 때 미묘하게 다른 것을 의미한다는 사실을 알아 차릴 가치가 있습니다. 예를 들어, 일반적으로! x포함하지 않는 윈 토토 만 일치합니다x어디서나. 하지만! x <- y매치y|x; 발생x윈 토토의 다른 곳에서는 일치를 방해하지 않습니다. 또 다른 예는X & Y일반적으로xandy둘 다 윈 토토 어딘가에 나타나지만(X & Y) <-- Z요구xandya 직전에 같은 장소에서 일치하려면Z. 따라서이 쿼리는와 다르게 작동합니다.x <- z & y <- z, 두 개의 별도 시퀀스가 포함 된 윈 토토와 일치합니다x zandy z. (이 특정 쿼리는 쓸모가 없습니다.xy같은 장소에서 일치 할 수 없습니다. 그러나 접두사 매치 패턴과 같은보다 복잡한 상황에서는이 양식의 쿼리가 유용 할 수 있습니다.)

12.1.3. 구성#

위는 모든 간단한 텍스트 검색 예입니다. 앞에서 언급했듯이 전문 검색 기능에는 더 많은 작업을 수행 할 수있는 기능이 포함됩니다. 특정 단어를 인덱싱하는 (단어 중지), 동의어를 처리하며, 예를 들어 공백 이상을 기준으로 구문 분석 (예 : 정교한 구문 분석)을 사용합니다. 이 기능은에 의해 제어됩니다.텍스트 검색 구성. PostgreSQL많은 언어에 대한 사전 정의 된 구성이 제공되며 자신의 구성을 쉽게 만들 수 있습니다. (PSQL's\ df명령이 사용 가능한 모든 구성을 표시합니다.)

설치 중에 적절한 구성이 선택되고default_text_search_config그에 따라 설정됩니다postgresql.conf. 전체 클러스터에 동일한 텍스트 검색 구성을 사용하는 경우 값을 사용할 수 있습니다.postgresql.conf. 클러스터 전체에 다른 구성을 사용하지만 하나의 데이터베이스 내에서 동일한 구성을 사용하려면 사용데이터베이스 변경 ... 세트. 그렇지 않으면 설정할 수 있습니다default_text_search_config각 세션에서.

구성에 의존하는 각 텍스트 검색 기능은 선택 사항이 있습니다RegConfig인수, 사용 구성을 명시 적으로 지정할 수 있도록default_text_search_config이 인수가 생략 될 때만 사용됩니다.

사용자 정의 텍스트 검색 구성을보다 쉽게 만들 수 있도록 간단한 데이터베이스 개체에서 구성이 구성됩니다..PostgreSQL의 텍스트 검색 기능은 4 가지 유형의 구성 관련 데이터베이스 개체를 제공합니다 :

  • 텍스트 검색 파서윈 토토를 토큰으로 나누고 각 토큰을 분류합니다 (예 : 단어 또는 숫자)

  • 텍스트 검색 사전토큰을 정규화 된 양식으로 변환하고 중지 단어를 거부하십시오.

  • 텍스트 검색 템플릿사전 기본 기능을 제공합니다. (사전은 단순히 템플릿의 템플릿과 매개 변수 세트를 지정합니다.)

  • 텍스트 검색 구성파서에서 생성 한 토큰을 정상화하는 데 사용할 구식 사전 및 사전 세트를 선택합니다.

텍스트 검색 파서 및 템플릿은 저수준 C 함수로 구축됩니다. 따라서 새로운 프로그램을 개발할 수있는 C 프로그래밍 능력과 슈퍼 사용자 권한이 데이터베이스에 설치할 수 있어야합니다. (에는 애드온 파서와 템플릿의 예가 있습니다.Contrib/영역PostgreSQL분포.) 사전 및 구성은 일부 기본 파서와 템플릿을 매개 변수화하고 연결하기 때문에 새로운 사전 또는 구성을 만들기 위해 특별한 권한이 필요하지 않습니다. 이 장의 뒷부분에서 맞춤형 사전 및 구성을 만드는 예가 나타납니다.