'루씬'에 해당되는 글 '3'건

  1. 2008/01/29 EUC-KR / UTF-8 (1)
  2. 2008/01/21 루씬 Query (1)
  3. 2008/01/09 [lucene] CLucene 설치 방법

최근 새롭게 전개되고 있는 웹서비스 형태를 정의하는 중요한 요소 중의 하나인 UTF-8 인코딩은, 전세계 문자집합을 동일한 하나의 인코딩 방식으로 표현할 수 있기 때문에 웹에 가장 적합하고, 또 웹 뿐만이 아닌 다른 서비스나 어플리케이션에서 사용하면 좋을 것 같은 문자 집합이다.

그동안 한국에서 웹용으로 가장 많이 사용하는 Charset은 EUC-KR(KSC5601)일 것이고,
개발자들이 어플리케이션이나 엔진, 특히 웹 어플리케이션을 개발하면서 가장 많이 부딪히게 되는 문제가 charset 처리, 국내 개발자들에게는 특히 한글 처리 문제일 것이다. 나도 지금까지는 이 분야에 대해서는 잘 몰라서 직접 해본적이 없는데, 이제는 어쩔 수 없이 직접 하고 있다.
(회사나 어떤 프로젝트를 진행하면서 개발자의 내공이 가장 많이 진보하는 시기는 "사수부재"의 순간이다. 혹은 "나 밖에 없네" 상황을 자각할 때, 그 내공은 못해도 10갑자는 늘기 마련이다.)

개발/튜닝 중인 검색엔진은 한글 처리가 영 신통치 않고, data 흐름에 있어서도 문자열 처리에 있어서는 앞뒤가 안맞는 부분이 많이 있다.
원 제작자가 영어권 사람이라, 비영어권의 multi-byte 캐릭터셋 처리에 있어 특히 아쉬운 부분이 많이 있다.
내가 어떤 서비스를 개발하는 과정에서 가장 신경을 많이 쓰고 공을 들이는 부분은 바로,
제공 되는, 혹은 제공해야 하는 API의 일관성이다. 내가 작성한 코드를 사용해야 하는 다른 코드나, client가 혼동하지 않도록 깔끔한 인터페이스를 작성하는 것이 요즘들어 가장 신경 쓰는 부분이고 후배 개발자들에게도 귀찮게 강조하는 부분이다.
지금 사용 중인 오픈 소스는 이러한 부분에서 약간 아쉽다.
물론 전반적으로 봤을 때는 엄청나고 감탄스럽다. 사실 오기가 발동하기는커녕 그 코드 스타일이나, 디자인 스타일을 모방하기 급급하다.

어쨋건 간에, EUC-KR charset을 유니코드나 멀티바이트 유니코드로 변환하기 위해서,
유니코드간의 인코딩 변환은 계산식으로 가능하지만, EUC-KR은 변환 규칙이 없기 때문에 사이즈가 꽤 큰 매핑 테이블을 사용해야 한다.
계산식이 필요없으므로 바이너리 검색이나 여타 좋은 알고리즘을 사용하면 속도는 더 빠를 수도 있겠지만, dso(dynamic shared object), 혹은 dll로 구현하여 스트레스성의 서비스 어플리케이션에서 빈번하게 로딩을 해야 한다면 라이브러리 내에 이러한 큰 테이블을 가지고 있는 것이 꽤 부담스러워진다. 게다가 테이블을 더 크게 만들거나 추가 테이블을 하드코딩해 놓으면 검색 속도를 높일 수 있다는 악마의 유혹까지 있다면..... 부담스러워도 이게 현실인가보다.

작성 중인 라이브러리의 내부에서 charset을 처리하는 루틴에서는 Simple Unicode를 사용하지만, 외부 인터페이스 부분에서는 UTF-8으로 변환 처리된다. EUC-KR은 데이타 소스로만 존재할 뿐이므로 한번만 Simple Unicode로 변환되면 그 후에는 유니코드 체계내에서만 상호 인/디코딩 처리되도록 한다.

일단 여기까지,,,
뭘 해도 정리가 안되는군.



2008/01/29 19:16 2008/01/29 19:16
Posted by scott

루씬 Query

dev/검색 2008/01/21 17:08

루씬에 내장된 Query 기능은 다양하다.
그중, 몇가지 한글 문서 검색에 사용할 수 있을 만한 Query Class를 살펴보면 다음과 같다.

1. Term Query.
   단순히 특정 필드에 특정 term이 존재하는 document를 검색한다.

2. Range Query.
   특정 필드 값의 시작~끝 범위에 존재하는지 검사한 후, 해당 document를 검색해낸다.

3. Prefix Query.
   문자열의 prefix를 포함하는지 검색하며, 이는 Category별로 분류되어있는 index를 검색할때 유용할 것으로 보인다.

4. Boolean Query.
   몇몇 query를 조합하여 질의가 가능하다. - AND, OR, NOT

5. Phrase Query.
   query term의 인접성을 만족하는 document를 검색해낸다.
   이것은 루씬의 indexing 정보에 각 term의 slop 정보가 포함되어 있기 때문에 가능하다.
   예를 들어 "빠르게 달리는 갈색 머리를 가진 늑대같은 남자"라는 document는
   "갈색", "늑대같은" 사이의 slop이 3이상으로 query 되어야 검색이 된다는 것이다.

6. Wildcard Query
   한글 문서 indexing에서 사용할 수 있을지 고민 중이다.

7. Fuzzy Query
   유사 term 검색용으로서, 특정 term과 비슷한 term을 검색한다.
   유사어, 혹은 speller에 적용 가능할지 검토 중이다.

2008/01/21 17:08 2008/01/21 17:08
Posted by scott
TAG ,
1. CLucene의 최신 버전은 0.9.20이며 아래 URL에서 구할수 있다.
http://sourceforge.net/projects/clucene/

2. GNU의 배포 형식을 따르고 있어 autotools로 컴파일, Library를 생성, system 설치가 가능하다.

Utility 참고 사이트 & download
http://www.gnu.org/software/autoconf/
http://www.gnu.org/software/automake/
http://www.gnu.org/software/libtool/
http://www.gnu.org/software/m4/

다음은 Build 과정이다.

partita@ubuntu-vm:/mnt/hgfs/win_shared/SearchBooster/clucene-core-0.9.20$./configure

partita@ubuntu-vm:/mnt/hgfs/win_shared/SearchBooster/clucene-core-0.9.20$make

partita@ubuntu-vm:/mnt/hgfs/win_shared/SearchBooster/clucene-core-0.9.20$make install

1) path 설정 : configure의 prefix를 지정하지 않으면 Makefile 생성시 default 설치 경로인 /usr/local을 지정하게 되며 make install을 통한 최종 라이브러리 설치 경로는 /usr/local/lib, 헤더 설치 경로는 /usr/local/include 이다.
따라서 CLucene 라이브러리를 링크하고자 하는 프로그램은 위의 lib, include 경로를 /etc/profile이나, LD_LIBRARY_PATH에 설정하여야 링크시 에러가 발생하지 않는다.
또는 ld.so.conf에 경로를 추가하는 방법도 된다고 한다.

2) autotools를 사용하여 빌드하면 static 라이브러리와 dynamic 라이브러리 모두 생성이 되며 install 시에도 두가지 모두 설치 디렉토리에 복사된다.
따라서 clucene 라이브러리를 사용하고자 하는 프로그램은 두가지 방법으로 링크가 가능하다.

3) demo 실행
partita@ubuntu-vm:/mnt/hgfs/win_shared/SearchBooster/clucene-core-0.9.20/src/demo$make
위와 같이 실행하면 cl_demo 실행 스크립트가 생성되는데, 이것은 테스트용으로 실제 설치된 clucene 라이브러리를 링크하는 것이 아니고 clucene 소스파일을 통판으로 묶어서 컴파일된 실행 이미지를 생성, 링크하는 것이다.

partita@ubuntu-vm:/mnt/hgfs/win_shared/SearchBooster/clucene-core-0.9.20/src/demo$./cl_demo

<sample text를 이용하여 indexing 과정>

사용자 삽입 이미지



<index와 segment 파일 생성>
사용자 삽입 이미지


<query, search 화면>
사용자 삽입 이미지


샘플 데이타는 /clucene-core-0.9.20/test/data/ 아래에 있다.


2008/01/09 15:29 2008/01/09 15:29
Posted by scott