database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Q&A 5125 게시물 읽기
No. 5125
tsearch2 사용기
작성자
김상기(ioseph)
작성일
2003-12-28 00:27ⓒ
2003-12-28 20:14ⓜ
조회수
6,007

http://www.sai.msu.su/%7Emegera/postgres/gist/tsearch/V2/docs/tsearch2-guide.html

 

문서를 시간 내서 차근히 읽어 보면서 작업 기록을 남깁니다.

full text search - 문서의 글자 위치에 상관 없이 인덱스를 사용해서 원하는 문서를 쉽게 찾아내는 것에 대한 핵심 기법 - 응용 분야는 도서 쇼핑몰에서 목차로 검색하기, 웹페이지 검색엔진, 게시판 검색, 등 무궁무진한 응용 분야가 있겠지요. 아마 데이터베이스를 사용하는 목적 가운데에서도 꽤 중요한 부분을 차지하고 있는 부분입니다.

 

아무튼 바로 본론으로 들어가서

7.4.x 소스를 구해서 서버를 설치했다는 것을 전제로 이야기를 진행하겠습니다.

 

먼저 tsearch2 관련 모듈을 컴파일하고 설치하셔야합니다.

소스의 contrib/tsearch2 안에 있습니다. 이 디렉토리로 이동해서 make ; make install 하면 설치가 되겠지요.

설치가 끝나면 configure 에서 지정한 $prefix 안에 /share/contrib/tsearch2.sql 파일이 생깁니다.

이놈을 psql 상에서 호출합니다.

\i tsearch2.sql

이런식으로 이렇게 하면 각종 type, function, trigger 등을 설정하면서 pg_ts_ 관련 테이블이 4개 생깁니다.

 

다음 tsearch2 기본 설정을 지정해야합니다. - 형태소 분석기는 뭘쓰고, 사전을 뭘쓰고 ... 이런 것들을 지정하는 것이지요. 현재 한글 관련으로 어떠한 것도 없으니, 그냥 기본적으로 제공하는 특정 split 문자 단위로만 잘라내는 기능을 사용하기로 하고 simple 환경으로 지정합니다.

mydb=# select set_curcfg('simple');
 set_curcfg
------------

(1 row)

 

다음 tsearch2 놈이 제대로 설치 되었는지 확인하기 위해서 문자열을 vector로 만들어는 함수인 to_tsvector() 함수를 호출해 봅니다.

mydb=# select to_tsvector('무궁화 꽃이 피었습니다');
            to_tsvector
------------------------------------
 '꽃이':2 '무궁화':1 '피었습니다':3
(1 row)

 

다음 테스팅할 테이블에 tsvector 자료형의 칼럼을 하나 추가 하고, gist 형태로 그 칼럼에 인덱스를 만들어줍니다.

mydb=# alter table saint add vector tsvector;
mydb=# create index saint_vector_i on saint using gist (vector);

 

다음 full text search 를 위한 칼럼의 자료를 to_tsvector로 바꾸어서 새로 만든 칼럼에 집어넣습니다.

 

윗 경우라면, 다음과 같은 쿼리겠지요.

update saint set vector = to_tsvector(memo);

 

(실재 자료로 테스팅을 해봐야겠기에 -.- 예제가 좀 그렇습니다)

테스팅 환경에서는 약 5천개의 자료가 약 30초 정도에 모두 끝났습니다.

 

무사히 update가 되었다면,

 

이제 사용해 봐야지요. tsvector 자료형에 대한 연산자로는 @@ 연산자와 || 연산자 뿐이네요 || 연산자는 모르겠고, @@ 연산자는 그 반대편 값으로 tsquery 자료형을 요구합니다. 그래서, 다음과 같은 형태로 사용되어집니다 .

mydb=# select num,h_name from saint where vector @@ to_tsquery('순교&배교');
 num  |   h_name
------+-------------
 2635 | 허협 바오로
(1 row)
Time: 12.476 ms
mydb=# explain select num,h_name from saint where vector @@ to_tsquery('순교&배교');
                                  QUERY PLAN
------------------------------------------------------------------------------
 Index Scan using saint_vector_i on saint  (cost=0.00..19.22 rows=5 width=16)
   Index Cond: (vector @@ '\'순교\' & \'배교\''::tsquery)
   Filter: (vector @@ '\'순교\' & \'배교\''::tsquery)
(3 rows)
Time: 3.208 ms

참으로 놀랄만한 수치지요. 제 경험으로는 지금까지 봐왔던 최고의 full text index 결과값입니다.

 

나머지 자세한 온갖 자질구레한 기능들은 윗 link 문서를 차근이 읽어가면서 직접 살펴보세요. 참한 기능들이 많네요.

 

-----

문제는!

윗 예제에서 만일 memo 값에 '순교했다' 라는 문자열이 있었다면, 윗 쿼리로 검색되지 않습니다. 왜냐하면, '순교' 와 '순교했다'의 vector 요소는 당연히 틀리기 때문입니다.

 

그렇다면, 여기서 우리나라 사람이 해야될 몫이,

'순교했다'를 '순교 + 하 + ㅆ + 다' 로 형태소 단위로 분리하고, '하다' 동사는 검색자료에서 제외한다는 제외조건을 지정하고, '순교'를 vector에 집어넣어야 한다는 것이지요.

그래야, '순교' == '순교했다'가 성립될 수 있겠지요.

이렇게 되려면,

이글 제일 앞에서 이야기한,

select set_curcfg('ko') 또는

select set_curcfg('ko_KR.eucKR')

이 쿼리가 정상적으로 돌아가야한다는 것입니다.

아주 슬픈 현실이지요.

요기까지 하고 결론으로 '실무에서는 사용못하겠네'라고 포기했습니다.

 

국어사전에 올라와 있는 단어만이라도해서 단어사전을 만들고,

형태소 분석기를 만들수만 있다면, 그리 꿈같은 이야기도 아닌데.....

 

 

이 글에 대한 댓글이 총 3건 있습니다.

오.. 좋네요..

누가 형태소 거시기를 해주면 좋으련만 -_-;

제가 할줄 몰라서 음하하

할수 있으면 조금씩 -_-; 해도 데지 않을까요

신기배(nonun)님이 2003-12-28 02:26에 작성한 댓글입니다.

얼마전에 제가 kldp에 형태소 분석기에 대한 도움을 구했더니 몇몇 분이 좋은 정보를 알려주셨습니다.

 

http://bbs.kldp.org/viewtopic.php?t=28772

 

저는 mnogosearch에 이놈을 응용해 보려고 하는데... 생각만 있고 시간이 없어서...

혹시 뜻 있고 능 있으신 분이 있으시면 부탁합니다.

박성철님이 2004-01-09 17:14에 작성한 댓글입니다. Edit

형태소 분석기

데모

http://lab.zagia.com

관련 글들을 읽으니 색인어 추출기 내지 형태소 분석기가 큰 문제군요

검색에서 색인어 추출은 가장 큰 역할을 합니다

어렵군님이 2004-07-29 17:55에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
5128[질문]윈도우에서 PostgreSQL 종료문제?? [2]
황남주
2003-12-29
3363
5127[질문] 'LOG: shmdt(0xe20000) failed: Invalid argument' 이거 어디서 확인하죠? [1]
황남주
2003-12-29
3128
5126난감한 index... [6]
초보
2003-12-28
4417
5125tsearch2 사용기 [3]
김상기
2003-12-28
6007
5124rtree 인덱스 질문 [1]
김상기
2003-12-27
2864
5123serial 과 index (두가지질문) [5]
초보
2003-12-27
3367
5122[질문]serial 필드 생성시 만들어지는 시퀀스테이블... [5]
wooki
2003-12-26
3375
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.027초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다