여러번 삽질의 결과 일단 삽질버전으로 완성을 했습니다.
SELECT * FROM to_tsvector('testcfg', '즐겁고 재미있는 우리 생활에 대하여 이야기해 봅시다.');;
to_tsvector
--------------------------------------------------
'생활':4 '우리':3 '즐겁':1 '이야기':5 '재미있':2
이렇게 나오더군여 ^^;
http://kldp.net/project/pgkts 에 정리한 소스를 2-3일 안에 올리겠습니다.
그전에 필요하신분은 요청글 올려주세여 ^^;
제가 테스트한 환경은 ubuntu 8.04이고 postrgresql 8.3버전입니다.
서버 클라이언트 양쪽다 utf-8인 환경에서 테스트했습니다.
수정해야할 부분은 KDICT_PATH를 코드상인 아닌 query나 다른곳에서 설정하는방법
그리고 server encoding을 확인해서 자동으로 encoding 설정하는부분입니다.
KTS가 euc-kr로 작성이 되어 있어서 중간 변환과정이 필요하더군여 ^^;
그럼
네이버 뉴스 내용을 조금 긁어서
select * from to_tsvector( 'testcfg', '에너지 바우처 제도란=에너지 바우처 제도는 유류비와 가스, 전기요금, 난방비 등 에너지를 소비할 때 드는 비용의 일부를 정부가 직접 보조해주는 방식이다. 예를 들어 영세 자영업자가 주유소에서 기름을 넣고 바우처를 제시하면 바우처에 적힌 금액만큼 기름값을 할인받는다.이와 유사한 바우처는 노인 장애인 돌보미와 방과후 학교 바우처 등이 있다.');
to_tsvector
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
'과':34 '등':11,37 '방':33 '예':19 '있':38 '장':30 '가스':7 '금액':26 '노인':29 '방식':18 '보조':17 '비용':14 '소비':13 '애인':31 '요금':9 '일부':15 '자가':21 '전기':8 '정부':16 '제도':5 '제시':24 '학교':35 '난방비':10 '돌보미':32 '바우처':2,4,23,25,28,36 '에너지':1,12 '유류비':6 '자영업':20 '제도란':3 '주유소':22 '기름값을':27
이렇게 되는군여
그래픽문자일 경우에 오류가 나는것도 수정을 해야합니다.
DNS의 글중
SELECT * FROM to_tsvector('testcfg', '문서를 시간 내서 차근히 읽어 보면서 작업 기록을 남깁니다.
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 환경으로 지정합니다.
set_curcfg
------------
(1 row)
다음 tsearch2 놈이 제대로 설치 되었는지 확인하기 위해서 문자열을 vector로 만들어는 함수인 to_tsvector() 함수를 호출해 봅니다.
다음 테스팅할 테이블에 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 자료형을 요구합니다. 그래서, 다음과 같은 형태로 사용되어집니다 .
참으로 놀랄만한 수치지요. 제 경험으로는 지금까지 봐왔던 최고의 full text index 결과값입니다.
나머지 자세한 온갖 자질구레한 기능들은 윗 link 문서를 차근이 읽어가면서 직접 살펴보세요. 참한 기능들이 많네요.
-----
문제는!
윗 예제에서 만일 memo 값에 ''순교했다'' 라는 문자열이 있었다면, 윗 쿼리로 검색되지 않습니다. 왜냐하면, ''순교'' 와 ''순교했다''의 vector 요소는 당연히 틀리기 때문입니다.
그렇다면, 여기서 우리나라 사람이 해야될 몫이,
''순교했다''를 ''순교 + 하 + ㅆ + 다'' 로 형태소 단위로 분리하고, ''하다'' 동사는 검색자료에서 제외한다는 제외조건을 지정하고, ''순교''를 vector에 집어넣어야 한다는 것이지요.
그래야, ''순교'' == ''순교했다''가 성립될 수 있겠지요.
이렇게 되려면,
이글 제일 앞에서 이야기한,
select set_curcfg(''ko'') 또는
select set_curcfg(''ko_KR.eucKR'')
이 쿼리가 정상적으로 돌아가야한다는 것입니다.
아주 슬픈 현실이지요.
요기까지 하고 결론으로 ''실무에서는 사용못하겠네''라고 포기했습니다.
국어사전에 올라와 있는 단어만이라도해서 단어사전을 만들고,
형태소 분석기를 만들수만 있다면, 그리 꿈같은 이야기도 아닌데.....');
to_tsvector
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
'검':24,29 '내':2 '등':31 '목':22 '문':6 '색':25,30 '쉽':14 '없':10 '있':35 '차':23 '글자':7 '기록':5 '기법':17 '대한':15 '도서':20 '목적':38 '문서':1,13 '분야':19,34 '사용':12,37 '상관':9 '위치':8 '응용':18,33 '작업':4 '핵심':16 '가운데':39 '게시판':28 '쇼핑몰':21 '인덱스':11 '중요한':40 '차근히':3 '검색엔진':27 '무궁무진':32 '웹페이지':26 '데이터베이스':36
New Line처리도 필요하군여 지금보니 ^^;
|