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 7434 게시물 읽기
No. 7434
tsearch2 에 KTS 접목하기.
작성자
김병석(byung82)
작성일
2008-05-29 03:19ⓒ
2008-05-29 03:58ⓜ
조회수
8,630

여러번 삽질의 결과 일단 삽질버전으로 완성을 했습니다.


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처리도 필요하군여 지금보니 ^^;


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

멋집니다

드디어 이동네도 이런게 나오는군요. 

10년 꿈이 이루워지는 순간입니다. 하하하

술 한 잔 삽니다. 나오세요. 

내일은 안되겠고, 6월 초로 미뤄야겠네요. 

김상기(ioseph)님이 2008-05-29 19:18에 작성한 댓글입니다.

개발 저작권을 BSD로 하실 요량이면, 

대강 정리되는 대로 올려주십시오. 

그럼 이곳에서 그 기능을 원했던 수많은 개발자들이 분명 

많은 참여를 할 것 같습니다. 

kldp 쪽에 소스 올려서 공개 프로젝트로 진행해 보시든지, 

라이센스 문제도 함께 알려주세요. 

제발 GPL쪽으로는 가지 마시길 바라면서. 크크


문제는 사전인데, 제가 알기로는 kts 에 있는 사전이 GPL 계열쪽인듯합니다. 

그럼 어떻게 될지가 사뭇 궁금하네요. 


배포에 있어서도 신경써야할 게 너무 많네요. 


빨리 보고싶어라. 하하하

김상기(ioseph)님이 2008-05-29 19:27에 작성한 댓글입니다.

정말 드디어 하시는 분들이 생기는군요~


pgsql 사용자라면 무쟈게 바라던 일일 것입니다.


실력 있는 개발자들의 아낌없는 노력을 원해 봅니다.


------ 이상 실력 안되는 비 개발자 드림...

정재익(neople)님이 2008-05-29 19:37에 작성한 댓글입니다.

kldp.net에 pgkts로 프로젝트는 만들어 두었습니다.


KTS가 GPL이라서 고민이 됩니다.


KTS호출부를 LGPL로 만들고 pgkts는 BSD로 사용해서


호출하면 라이센스 문제가발생하지 않는지 아시는분 답변 부탁드리겠습니다.

김병석(byung82)님이 2008-05-29 20:13에 작성한 댓글입니다.
이 댓글은 2008-05-29 20:32에 마지막으로 수정되었습니다.

개발 소프트웨어 관련 라이센스 정책은 멋지네요. 
그럼 한국 full text 쓰는 서비스에서 단지 lgpl 라이브러리를 쓴다고 언급만 해주면 될 것 같네요. 

문제는 kts로 만든 한국어사전 자료가 문제네요. 
이건 어떻게 될지 kts 개발자랑 연결을 해봐야하는데, 
문제는 너무 오래된 소스인지라, 연락이 될지도 모르겠습니다. 

김상기(ioseph)님이 2008-05-29 20:47에 작성한 댓글입니다.

GPL 소프트웨어에 의존적이면서.. 게다가 같이 배포도 이루어 져야 한다면 GPL이 되는 수 밖에는.. ㅠㅠ

tsearch2처럼 예외적인 상황을 저작권자가 허용해주면 최고겠네요 ㅎ

신기배(소타)님이 2008-05-30 00:18에 작성한 댓글입니다.

korea.gnu.org에 문의를 했습니다.


답변이 왔는데


GPL로 만들어질경우 LGPL로 작성이 불가능하다는 답변이 왔습니다.


그래서 방향을 선회합니다.


KTS 동작 데몬을 만들고 tsearch 에서 데몬통신으로 하는쪽으로 방향전환을 해야겠습니다.


혹시 이런경우 좋은 모델을 알고계시면 좀올려주세여..


그래서


KTS 데몬 GPL,

TSERACH2 Plugin BSD


이런씩으로 작업을 해야겠습니다.


그럼

김병석(byung82)님이 2008-05-30 14:11에 작성한 댓글입니다.
이 댓글은 2008-05-30 14:12에 마지막으로 수정되었습니다.

차라리 원저작자 이상호님을 찾아서 GPL 소스의 수정본을 BSD 라이센스로 바꾸어도 좋겠냐고 물어보는 것이 더 나을 것 같습니다. 


그렇게 데몬형태로 분리되고, 그것과 통신 하는 방식이면 관리가 힘들어집니다. 

거기다가 메인 개발 소스 안으로 흡수 되지도 못할 것 같네요. 


다시 보자, GPL!

세상에 모든 소스가 GPL 라이센스로 배포되는 그날까지.


일단 개발 진행하고, 

결국 오픈소스 프로젝트의 DB 부분만 맡게 될 것 같네요.


KTS 라이센스 정해지기까지 과정을 읽어보니, 문제는 KTS 사용할 때 상업 용도로 쓰지 말았으면 하는 원 제작자의 의도가 있어 

GPL이라고 하고 오픈 소스 정책으로 간다고 해도 상업적인 용도로 쓰기가 참 모호해집니다. 


뭐가 이리 복잡해지는지 

그냥 니 꼴리는대로 써라. 단지 양심만 지켜다오!

이게 이 세상에서는 그리도 힘든가봅니다.

김상기(ioseph)님이 2008-05-30 17:24에 작성한 댓글입니다.

C로 만드는 함수는 소켓 연결이 되나요?

pl/perl 의 경우 소켓 연결쪽을 사용할 수 없었거든요 예전에.. 소스를 수정해서 강제로 되게 만들었더니 pgsql이 죽어버리고 그랬었습니다 =_=

원저작자에게 pgsql 플러그인에만 되게 해달라고 땡깡 놓으면 될 지도 ㅠㅠㅠㅠ

신기배(소타)님이 2008-05-30 17:30에 작성한 댓글입니다.

^^;


이리저리 고민이 되는군여..


관리를 위해서는 한곳에 묶어두는게 좋은데 ㅎㅎ


좋은방법들 애기해주시기 바랍니다 ^^;


일단 라이스센문제가 되는것 무시하고


tsearch2 plugin은 BSD kts 호출 dll LGPL로 해보겠습니다.


진행중에 원저작자와 연락이되면 다들 부탁좀 해주세여 ㅎㅎ

김병석(byung82)님이 2008-05-30 17:45에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
7437pl/pgsql 함수에서 insert결과 받아오기 [2]
송우진
2008-06-01
7393
7436KTS TSEARCH2 Plugin pgkts pre alpha 버전을 등록했습니다. [4]
김병석
2008-05-30
6980
7435server encoding이나 client encoding을 가져오는 방법 [5]
김병석
2008-05-29
7143
7434tsearch2 에 KTS 접목하기. [10]
김병석
2008-05-29
8630
7433v8.3.1 로 업그레이드 한후 조회 속도가 많이 떨어지네요. 저만그런건가요? [1]
박근준
2008-05-28
6574
7432tsearch2 에 kts접목에 관해서 [4]
김병석
2008-05-27
6712
7431Visual Studio build 시 dmetaphone.c 컴파일 에러 [10]
김대청
2008-05-27
9179
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.050초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다