전체 텍스트 검색(또는 그냥텍스트 검색)은 자연어 식별 기능을 제공합니다.윈 토토a를 만족시키는질의, 선택적으로 쿼리 관련성을 기준으로 정렬합니다. 가장 일반적인 검색 유형은 주어진 내용을 포함하는 모든 윈 토토를 찾는 것입니다.검색어그리고 순서대로 반환유사성질의에. 의 개념질의그리고유사성매우 유연하며 특정 애플리케이션에 따라 다릅니다. 가장 간단한 검색이 고려됩니다.107PostgreSQL: 윈 토토: 12: 12.1. 소개50단어 집합으로유사성윈 토토에서 검색어의 빈도로.
텍스트 검색 연산자는 수년간 데이터베이스에 존재해 왔습니다.PostgreSQL있음~, ~*, 좋아요및좋아요텍스트 데이터 유형에 대한 연산자이지만 현대 정보 시스템에 필요한 많은 필수 속성이 부족합니다.
영어에 대해서도 언어 지원이 없습니다. 정규 표현식은 파생어를 쉽게 처리할 수 없기 때문에 충분하지 않습니다(예:만족합니다그리고만족하다. 다음을 포함하는 윈 토토가 누락될 수 있습니다.만족합니다, 검색할 때 찾고 싶을 수도 있지만만족하다. 사용이 가능합니다또는여러 파생 형태를 검색하려면 지루하고 오류가 발생하기 쉽습니다(일부 단어에는 수천 개의 파생 형태가 있을 수 있음).
검색 결과의 순서(순위)를 제공하지 않으므로 수천 개의 일치하는 윈 토토가 발견되면 효과가 없습니다.
색인 지원이 없기 때문에 속도가 느린 경향이 있으므로 검색할 때마다 모든 윈 토토를 처리해야 합니다.
전체 텍스트 색인을 사용하면 윈 토토를 다음과 같이 만들 수 있습니다.전처리됨및 나중에 빠른 검색을 위해 저장된 색인입니다. 전처리에는 다음이 포함됩니다.
윈 토토를 구문 분석하는 중토큰. 숫자, 단어, 복잡한 단어, 이메일 주소 등 다양한 종류의 토큰을 식별하여 다르게 처리할 수 있도록 하는 것이 유용합니다. 원칙적으로 토큰 클래스는 특정 애플리케이션에 따라 다르지만 대부분의 경우 사전 정의된 클래스 세트를 사용하는 것이 적합합니다.포스트그레SQL사용파서이 단계를 수행합니다. 표준 파서가 제공되며 특정 요구에 맞게 사용자 정의 파서를 생성할 수 있습니다.
토큰을 다음으로 변환 중어휘. 어휘소는 토큰과 마찬가지로 문자열이지만,정규화그래서 같은 단어의 다른 형태가 비슷해집니다. 예를 들어 정규화에는 거의 항상 대문자를 소문자로 접는 작업이 포함되며 종종 접미사(예:s또는es영어). 이를 통해 가능한 모든 변형을 지루하게 입력하지 않고도 동일한 단어의 변형 형태를 검색할 수 있습니다. 또한 이 단계에서는 일반적으로 다음을 제거합니다.단어 중지, 너무 흔해서 검색에 쓸모가 없는 단어입니다. (즉, 토큰은 윈 토토 텍스트의 원시 조각인 반면, 어휘소는 색인 생성 및 검색에 유용하다고 생각되는 단어입니다.)PostgreSQL사용사전이 단계를 수행합니다. 다양한 표준 사전이 제공되며, 특정 요구에 맞게 맞춤 사전을 만들 수 있습니다.
검색에 최적화된 전처리 윈 토토 저장. 예를 들어, 각 윈 토토는 정규화된 어휘의 정렬된 배열로 표시될 수 있습니다. 어휘와 함께 사용할 위치 정보를 저장하는 것이 종종 바람직합니다.근접 순위, 더 많은 내용을 포함하는 윈 토토가 되도록“밀도”쿼리 단어가 있는 영역은 쿼리 단어가 흩어져 있는 영역보다 더 높은 순위가 할당됩니다.
사전을 사용하면 토큰 정규화 방법을 세밀하게 제어할 수 있습니다. 적절한 사전을 사용하면 다음을 수행할 수 있습니다.
색인이 생성되어서는 안되는 불용어를 정의하세요.
다음을 사용하여 동의어를 단일 단어로 매핑Ispell.
동의어 사전을 사용하여 구문을 단일 단어로 매핑합니다.
다음을 사용하여 단어의 다양한 변형을 표준 형식으로 매핑합니다.Ispell사전.
다음을 사용하여 단어의 다양한 변형을 표준 형식으로 매핑눈덩이형태소 분석 규칙.
데이터 유형ts벡터유형과 함께 전처리된 윈 토토를 저장하기 위해 제공됩니다.tsquery처리된 쿼리를 나타내기 위해(PostgreSQL : 문서 : 12 : 8.11. 텍스트 토토 사이트 유형). 이러한 데이터 유형에 사용할 수 있는 많은 함수와 연산자가 있습니다(PostgreSQL : 문서 : 12 : 9.13. 스포츠 토토 검색 기능 및 연산자), 그 중 가장 중요한 것은 일치 연산자입니다.@@에서 소개합니다.섹션 12.1.2. 인덱스를 사용하면 전체 텍스트 검색 속도를 높일 수 있습니다(PostgreSQL : 문서 : 12 : 12.9. 텍스트 검색을위한 우선 메이저 토토 사이트 유형).
A 윈 토토은 전문 검색 시스템에서 검색하는 단위입니다. 예를 들어 잡지 기사나 이메일 메시지 등이 있습니다. 텍스트 검색 엔진은 윈 토토를 구문 분석하고 상위 윈 토토와 어휘소(키워드)의 연관을 저장할 수 있어야 합니다. 나중에 이러한 연관은 검색어가 포함된 윈 토토를 검색하는 데 사용됩니다.
다음 내에서 검색하는 경우PostgreSQL, 윈 토토는 일반적으로 데이터베이스 테이블 행 내의 텍스트 필드이거나 이러한 필드의 조합(연결)일 수 있으며 여러 테이블에 저장되거나 동적으로 얻을 수 있습니다. 즉, 윈 토토는 인덱싱을 위해 여러 부분으로 구성될 수 있으며 전체적으로 어디에도 저장되지 않을 수 있습니다. 예를 들면:
제목 선택 || ' ' || 작성자 || ' ' || 추상 || ' ' || 본문 AS 윈 토토 메시지에서 어디에서 mid = 12; SELECT m.제목 || ' ' || m.작가 || ' ' || m.추상 || ' ' || d.body AS 윈 토토 FROM 메시지 m, 윈 토토 d 여기서 m.mid = d.did AND m.mid = 12;
사실, 이 예시 쿼리에서는,합체단일을 방지하는 데 사용해야 합니다.NULL속성을 유발하여NULL전체 윈 토토에 대한 결과입니다.
또 다른 가능성은 윈 토토를 파일 시스템에 간단한 텍스트 파일로 저장하는 것입니다. 이 경우 데이터베이스를 사용하여 전체 텍스트 인덱스를 저장하고 검색을 실행할 수 있으며 일부 고유 식별자를 사용하여 파일 시스템에서 윈 토토를 검색할 수 있습니다. 그러나 데이터베이스 외부에서 파일을 검색하려면 수퍼유저 권한이나 특수 기능 지원이 필요하므로 일반적으로 모든 데이터를 내부에 보관하는 것보다 덜 편리합니다.PostgreSQL. 또한 모든 것을 데이터베이스 내부에 보관하면 윈 토토 메타데이터에 쉽게 액세스하여 색인 생성 및 표시를 지원할 수 있습니다.
텍스트 검색을 위해 각 윈 토토는 전처리된 윈 토토로 축소되어야 합니다.ts벡터형식. 검색 및 순위 지정은 전적으로에서 수행됩니다.ts벡터윈 토토 표현 — 사용자에게 표시하기 위해 윈 토토를 선택한 경우에만 원본 텍스트를 검색하면 됩니다. 그러므로 우리는 종종 다음과 같은 말을 합니다.ts벡터윈 토토로서, 그러나 물론 전체 윈 토토를 간략하게 표현한 것일 뿐입니다.
전체 텍스트 검색포스트그레SQL일치 연산자를 기반으로 함@@, 반환참if ats벡터(윈 토토)는 a와 일치합니다.tsquery(쿼리). 어떤 데이터 유형이 먼저 기록되는지는 중요하지 않습니다.
SELECT '뚱뚱한 고양이가 매트 위에 앉아 살찐 쥐를 먹었습니다'::tsVector @@ 'cat & rat'::tsquery; ?열? ---------- 티 SELECT '뚱뚱하고 소'::tsquery @@ '뚱뚱한 고양이가 매트 위에 앉아 살찐 쥐를 먹었습니다.'::tsVector; ?열? ---------- 에프
위의 예에서 알 수 있듯이, atsquery단지 원시 텍스트가 아닙니다.ts벡터입니다. 갑tsquery이미 정규화된 어휘소여야 하는 검색어를 포함하며 AND, OR, NOT 및 FOLLOWED BY 연산자를 사용하여 여러 용어를 결합할 수 있습니다. (구문 세부정보는 참조섹션 8.11.2.) 기능이 있습니다to_tsquery, plainto_tsquery및phraseto_tsquery사용자가 작성한 텍스트를 적절한 텍스트로 변환하는 데 도움이 됩니다.tsquery, 주로 텍스트에 나타나는 단어를 정규화하여 수행됩니다. 마찬가지로,to_ts벡터윈 토토 문자열을 구문 분석하고 정규화하는 데 사용됩니다. 따라서 실제로 텍스트 검색 일치는 다음과 같습니다.
SELECT to_tsVector('뚱뚱한 고양이가 뚱뚱한 쥐를 먹었습니다') @@ to_tsquery('뚱뚱하고 쥐');
?열?
----------
티
다음과 같이 작성하면 이 일치가 성공하지 못할 것임을 관찰하십시오.
SELECT '뚱뚱한 고양이가 뚱뚱한 쥐를 먹었습니다'::tsVector @@ to_tsquery('뚱뚱한 & 쥐');
?열?
----------
에프
여기에는 단어의 정규화가 없으므로쥐이 발생합니다. a의 요소ts벡터어휘소는 이미 표준화된 것으로 가정됩니다. 따라서쥐일치하지 않음쥐.
그@@연산자도 지원합니다텍스트입력, 텍스트 문자열을 다음으로 명시적으로 변환할 수 있음ts벡터또는tsquery간단한 경우에는 건너뜁니다. 사용 가능한 변형은 다음과 같습니다.
ts벡터 @@ tsquery tsquery @@ ts벡터 텍스트@@tsquery 문자 @@ 문자
이들 중 처음 두 가지는 이미 보았습니다. 양식텍스트 @@ tsquery다음과 동일함to_tsVector(x) @@ y. 양식텍스트 @@ 텍스트다음과 동일함to_tsVector(x) @@ plainto_tsquery(y).
a 내에서tsquery, 그&(AND) 연산자는 두 인수가 모두 윈 토토에 나타나야 일치하도록 지정합니다. 마찬가지로,|(OR) 연산자는 인수 중 하나 이상이 나타나야 함을 지정하는 반면,!(NOT) 연산자는 인수가 다음과 같아야 함을 지정합니다.아님일치하기 위해 나타납니다. 예를 들어 쿼리지방 & ! 쥐다음을 포함하는 윈 토토와 일치지방하지만 아님쥐.
문구 검색은 다음의 도움으로 가능합니다.<-(다음 항목)tsquery연산자는 인수가 주어진 순서대로 인접하고 일치하는 항목이 있는 경우에만 일치합니다. 예를 들면:
SELECT to_tsVector('치명적인 오류') @@ to_tsquery('치명적인 <- 오류');
?열?
----------
티
SELECT to_tsVector('오류는 치명적이지 않습니다.') @@ to_tsquery('치명적인 <- 오류');
?열?
----------
에프
다음 형식을 갖는 FOLLOWED BY 연산자의 보다 일반적인 버전이 있습니다.<, 여기서NN은 일치하는 어휘의 위치 간의 차이를 나타내는 정수입니다.<1다음과 같습니다<-, 그동안<2일치 항목 사이에 정확히 하나의 다른 어휘가 나타날 수 있도록 허용합니다.phraseto_tsquery함수는 이 연산자를 사용하여 다음을 구성합니다.tsquery단어 중 일부가 불용어인 경우 여러 단어로 구성된 구문과 일치할 수 있습니다. 예를 들면:
SELECTphraseto_tsquery('고양이가 쥐를 먹었습니다');
Phraseto_tsquery
------------------
'고양이' <- '먹었다' <- '쥐'
SELECTphraseto_tsquery('고양이가 쥐를 먹었습니다');
Phraseto_tsquery
------------------
'고양이' <- '먹었다' <2 '쥐'
때때로 유용한 특별한 경우는 다음과 같습니다.<0두 패턴이 동일한 단어와 일치하도록 요구하는 데 사용할 수 있습니다.
괄호를 사용하여 중첩을 제어할 수 있습니다.tsquery연산자. 괄호 없이,|바인딩이 가장 느슨해지면&그러면<-및!가장 단단하게.
AND/OR/NOT 연산자는 FOLLOWED BY 연산자의 인수 내에 있을 때와 그렇지 않을 때 미묘하게 다른 것을 의미한다는 점에 주목할 가치가 있습니다. 왜냐하면 FOLLOWED BY 내에서 일치하는 정확한 위치가 중요하기 때문입니다. 예를 들어 일반적으로!x다음을 포함하지 않는 윈 토토만 일치x어디든. 하지만!x <- y일치y즉시가 아닌 경우x; 다음의 발생x윈 토토의 다른 곳에서는 일치가 방지되지 않습니다. 또 다른 예는 다음과 같습니다.x & y일반적으로 그것만 필요합니다x그리고y둘 다 윈 토토 어딘가에 나타나지만(x & y) <- z요구됨x그리고y같은 장소에서 일치시키다, a 직전에z. 따라서 이 쿼리는 다음과 다르게 동작합니다.x <- z & y <- z, 이는 두 개의 개별 시퀀스를 포함하는 윈 토토와 일치합니다.xz그리고y z. (이 특정 쿼리는 작성된 대로 쓸모가 없습니다.x그리고y같은 장소에서는 일치할 수 없습니다. 그러나 접두사 일치 패턴과 같은 더 복잡한 상황에서는 이 형식의 쿼리가 유용할 수 있습니다.)
위의 내용은 모두 간단한 텍스트 검색 예입니다. 앞에서 언급한 것처럼 전체 텍스트 검색 기능에는 특정 단어(중지 단어) 색인 생성 건너뛰기, 동의어 처리, 정교한 구문 분석 사용(예: 공백 이상의 구문 분석) 등 더 많은 작업을 수행할 수 있는 기능이 포함됩니다. 이 기능은 다음으로 제어됩니다.텍스트 검색 구성. PostgreSQL다양한 언어에 대해 사전 정의된 구성이 함께 제공되며 자신만의 구성을 쉽게 만들 수 있습니다. (psql의\dF명령은 사용 가능한 모든 구성을 표시합니다.)
설치하는 동안 적절한 구성이 선택되고default_text_search_config에 따라 설정됨postgresql.conf. 전체 클러스터에 대해 동일한 텍스트 검색 구성을 사용하는 경우 다음 값을 사용할 수 있습니다.postgresql.conf. 클러스터 전체에서는 서로 다른 구성을 사용하지만 하나의 데이터베이스 내에서는 동일한 구성을 사용하려면 다음을 사용하세요.데이터베이스 변경...설정. 그렇지 않으면 설정할 수 있습니다.default_text_search_config각 세션에서.
구성에 따라 달라지는 각 텍스트 검색 기능에는 선택 사항이 있습니다.regconfig인수, 사용할 구성을 명시적으로 지정할 수 있습니다.default_text_search_config이 인수가 생략된 경우에만 사용됩니다.
사용자 정의 텍스트 검색 구성을 더 쉽게 구축할 수 있도록 구성은 더 간단한 데이터베이스 개체로 구성됩니다.PostgreSQL의 텍스트 검색 기능은 네 가지 유형의 구성 관련 데이터베이스 개체를 제공합니다.
텍스트 검색 파서윈 토토를 토큰으로 나누고 각 토큰을 분류합니다(예: 단어 또는 숫자).
텍스트 검색 사전토큰을 정규화된 형식으로 변환하고 불용어를 거부합니다.
텍스트 검색 템플릿사전의 기본 기능을 제공합니다. (사전은 단순히 템플릿과 템플릿에 대한 매개변수 집합을 지정합니다.)
텍스트 검색 구성파서가 생성한 토큰을 정규화하는 데 사용할 파서와 사전 세트를 선택하세요.
텍스트 검색 파서와 템플릿은 낮은 수준의 C 함수로 구축되었습니다. 따라서 새로운 것을 개발하려면 C 프로그래밍 능력이 필요하고 데이터베이스에 설치하려면 수퍼유저 권한이 필요합니다. (다음 페이지에 추가 파서 및 템플릿의 예가 있습니다.기여/지역PostgreSQL배포.) 사전과 구성은 일부 기본 파서와 템플릿을 매개변수화하고 함께 연결하기 때문에 새 사전이나 구성을 생성하는 데 특별한 권한이 필요하지 않습니다. 사용자 정의 사전 및 구성 생성의 예는 이 장의 뒷부분에 나와 있습니다.