반응형

본문: https://www.postgresql.org/docs/10/textsearch-intro.html

 

PostgreSQL: Documentation: 10: 12.1. Introduction

Full Text Searching (or just text search) provides the capability to identify natural-language documents that satisfy a query, and optionally to sort them by relevance to the query. The most common type of search is to find all documents containing given q

www.postgresql.org

[ 이 글은 본문의 전체를 번역한 글은 아닙니다. 본인이 중요하다고 생각되는 부분만 정리하였습니다 ]

 

Introduction

Textual search operator들은 예전부터 데이터베이스에 있었다. PostgreSQL은 ~, ~*,LIKE, ILIKE같은 operator들을 사용할 수 있었는데 이들은 현대의 정보 시스템에서 필수적인 여러 요소들이 고려되어있지 않다.

 

정규표현식은 단어들이 조금이라도 변형되면 찾지 못한다. 예를 들면 satisfy와 satisfies가 있다. satisfy로 검색하였을 때, satisfies로 쓰인 데이터를 놓치게된다. OR을 사용하여 여러개의 변형된 형태를 추가할 수 있겠지만, 매우 지루하고 에러가 생길 여지가 많다(어떤 단어들은 수천가지의 형태로 변형될 수 있다).

 

Full Text Indexing은 document를 전처리하여 빠르게 검색될 수 있도록 한다.

 

- Document를 Token으로 해체한다. document을 token으로 해체하고 token들을 숫자, 단어, 이메일 주소 등의 class로 파악한다. Document란 Full Text Search에서의 단위이다. 뉴스 기사나 이메일 내용같은 것들이 될 수 있다.

- Token을 Lexem으로 변환한다. lexem이란 token과 같이 문자열로 되어있지만 '정규화'되어 다양한 형태로 표현된 하나의 단어라면 같은 단어로 만들어져있다. 예를 들자면 대문자로 되어있다면 소문자로 바꾸고, 단어뒤에 붙는 -s, -es들을 제거하는 것 등이 있다.

- 전처리된 Docment를 검색하기 좋은 형태로 저장한다. 각각의 document는 정렬되고 정규화된 lexem들의 배열로 표현할 수 있다.

 

tsvector타입을 사용하면 전처리된 document를 저장하고, tsquery를 사용하여 검색할 수 있다.

 

Basic Text Matching

PostgreSQL의 Full Text Searching은 @@연산자를 사용한다. @@연산자는 tsvector가 tsquery와 매칭이 될 경우 true를 반환한다.

SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector @@ 'cat & rat'::tsquery;
 ?column?
----------
 t

SELECT 'fat & cow'::tsquery @@ 'a fat cat sat on a mat and ate a fat rat'::tsvector;
 ?column?
----------
 f

tsquery는 이미 정규화된 상태의 lexem들을 검색어로 가지고 있어야하며 AND, OR, NOT, FOLLOWED BY와 같은 연산자와 같이 사용될 수 있다.

 

SELECT to_tsvector('fat cats ate fat rats') @@ to_tsquery('fat & rat');
 ?column? 
----------
 t
 

SELECT 'fat cats ate fat rats'::tsvector @@ to_tsquery('fat & rat');
 ?column? 
----------
 f

위의 코드에서 to_tsvector가 document string을 정규화시켜주므로 true가 반환되지만 밑의 예제는 이미 정규화된 것으로 판단하여 처리하므로 rats 와 rat은 다르기때문에 false를 반환한다.

반응형
블로그 이미지

개발자_무형

,