지원 버전 :현재(17) /16 / 15 / 14 / 13
개발 버전 :18 / Devel
지원되지 않은 버전 :12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3
이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다현재버전 또는 위에 나열된 다른 지원되는 버전 중 하나입니다.

12.1. 소개

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

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

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

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

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

전체 텍스트 인덱싱 허용 문서전처리그리고 나중에 빠른 검색을 위해 저장된 색인. 전처리 포함 :

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

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

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

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

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

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

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

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

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

데이터 유형soi kèo bóng đá truoctran유형과 함께 전처리 문서를 저장할 수 있도록 제공soi kèo bóng đá truoctran처리 된 쿼리를 나타내는 경우 (섹션 8.11). 이러한 데이터 유형에 사용할 수있는 많은 기능과 연산자가 있습니다 (섹션 9.13), 가장 중요한 것은 매치 연산자입니다@@, 우리가 소개하는섹션 12.1.2. 인덱스를 사용하여 전체 텍스트 검색을 가속화 할 수 있습니다 (섹션 12.9).

12.1.1. 문서 란 무엇입니까?

a문서전체 텍스트 검색 시스템에서 검색 단위입니다. 예를 들어, 잡지 기사 또는 이메일 메시지. 텍스트 검색 엔진은 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. 또한 데이터베이스 내부에 모든 것을 유지하면 문서 메타 데이터에 쉽게 액세스 할 수있어 인덱싱 및 디스플레이를 지원합니다.

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

12.1.2. 기본 텍스트 일치

전체 텍스트 검색에서PostgreSQL경기 연산자를 기반으로@@, 반환trueif asoi kèo bóng đá truoctran(문서) 일치 asoi kèo bóng đá truoctran(쿼리). 어떤 데이터 유형이 먼저 기록되었는지는 중요하지 않습니다.

'뚱뚱한 고양이가 매트에 앉아 뚱뚱한 쥐를 먹었다':: tsvector @@ 'cat & rat':: soi kèo bóng đá truoctran;
 ?열?
---------
 티

'fat & cow':: soi kèo bóng đá truoctran @@ '뚱뚱한 고양이가 매트에 앉아 뚱뚱한 쥐를 먹었다':: tsvector;
 ?열?
---------
 에프

위의 예에서 알 수 있듯이 Asoi kèo bóng đá truoctran단순한 텍스트가 아니라soi kèo bóng đá truoctranIS. 에이soi kèo bóng đá truoctran는 이미 정규화 된 Lexemes 여야하는 검색어를 포함하며, 사용 및 사용되지 않은 여러 용어를 결합하여 연산자를 결합 할 수 있습니다. (구문 세부 사항은 참조)섹션 8.11.2.) 기능이 있습니다to_tsquery, plainto_tsqueryPhraseto_tsquery사용자가 작성한 텍스트를 적절한 것으로 변환하는 데 도움이되는soi kèo bóng đá truoctran, 주로 텍스트에 나타나는 단어를 정규화함으로써. 비슷하게,to_tsvector문자열을 구문 분석하고 정규화하는 데 사용됩니다. 실제로 텍스트 검색 경기는 다음과 같습니다.

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

|

'지방 고양이는 지방 쥐를 먹었다':: soi kèo bóng đá truoctran @@ to_tsquery ( 'fat & rat');
 ?열? 
---------
 에프

여기서 단어의 정규화가 없으므로발생합니다. A의 요소soi kèo bóng đá truoctranLexemes는 이미 정규화되었다고 가정하므로일치하지 않습니다rat.

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

tsvector @@ soi kèo bóng đá truoctran
soi kèo bóng đá truoctran @@ tsvector
텍스트 @@ soi kèo bóng đá truoctran
텍스트 @@ 텍스트

우리가 이미 본 첫 번째 두 가지. 양식텍스트 @@ soi kèo bóng đá truoctranto_tsvector (x) @@ y. 양식​​텍스트 @@ 텍스트와 동일합니다to_tsvector (x) @@ plainto_tsquery (y).

a 내soi kèo bóng đá truoctran, The&(및) 연산자는 문서에 두 개의 인수가 일치하도록해야한다고 지정합니다. 마찬가지로|(또는) 운영자는 적어도 하나의 인수가 나타나야한다고 지정하고!(NOT) 운영자는 해당 주장이 있어야한다고 지정합니다.not일치하기 위해 나타납니다. 예를 들어, 쿼리Fat &! 쥐포함 된 문서와 일치지방하지만rat.

문구 검색이 가능합니다.<--(뒤 따르는)soi kèo bóng đá truoctran운영자, 인수가 인접하고 주어진 순서로 일치하는 경우에만 일치합니다. 예를 들어:

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

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

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

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

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

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

괄호는을 제어하는 ​​데 사용할 수 있습니다soi kèo bóng đá truoctran운영자. 괄호없이|최소 단단하게 바인딩 한 다음&,<--!가장 단단히.

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

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분포.) 사전 및 구성은 일부 기본 파서와 템플릿을 매개 변수화하고 연결하기 때문에 새로운 사전 또는 구성을 만들기 위해 특별한 권한이 필요하지 않습니다. 이 장의 뒷부분에서 맞춤형 사전 및 구성을 만드는 예가 나타납니다.