1. 서론

  스핑크스(sphinx) 1.x 버전에서 부터는 RT Index를 지원을 해주고 있다. 하지만 설명에서 이것저것 지원이 안되는 기능들이 좀 있는 것 같아 merging index를 테스트 해보기로 했다. 이 부분 또한 사이트(http://www.sphinxsearch.com)에 설명이 되있다. 하지만 이거 하면서 삽질한것들을 나중에 사이트만 보고 다시 하게 되면 또 할듯 해서 이렇게 글로 남겨 놓는다.


2. 목적

  documents라는 테이블에 100개의 row가 존재한다고 해보자. 우리는 이 100개의 row를 indexing해서 search 하게 될것이다. 그런데 여기서 추가적으로 10개의 데이터가 들어와 총 데이터가 110개가 됐을 경우를 생각해 보자. 이 경우 우리는 어떻게 해야 할까? 새롭게 Indexing을 해야 할까? 지금 예를 든것과 같이 데이터가 작을 경우는 문제가되지 않겠지만 데이터가 900만건 정도 되는 큰 데이터일 경우 상당한 문제가된다. 대략 1분 40초 가량의 인덱싱 시간을 소비하게 되는데 이걸 매번 할수는 없는 일이다. 비용적으로 말이 안된다. 그렇기 때문에 ReIndexing이 필요하다.


3. 테이블 정보 셋팅

  사이트에 보면은 main과 delta 라는 인덱스를 생성하고 delta라는 인덱스를 이용해 main에 최신 데이터를 갱신해 주게끔 설명이 되있어 설명에 따라 테스트를 진행했습니다.


테이블 정보(스핑크스 샘플 및 사이트의 예제를 통해 만든 테이블) :

document_counter(counter_id,max_doc_id)

documents(id, group_id, group_id2, date_added, title, content)


  1) document_counter의 경우 main 인덱스가 인덱싱한 documents의 마지막 id 값을 가지게 됩니다.

  2) documents의 경우는 실질적인 데이터를 가지게 됩니다.


4. sphinx.conf 셋팅

  config 파일의 경우 내용이 좀 길어서 첨부하겠습니다. 그리고 필요한 부분만 따로 글로 옮기겠습니다.


  - source main

    이곳에서는 쿼리만을 보면 될듯 합니다.

    그리 어렵지 않으니 한번 보면 알수 있을듯 합니다.

  우선 REPLACE INTO 부분을 보시게되면은 documents에 id의 max값을 구해 document_counter에 넣어주는것을 볼수 있습니다. 이것은 아래 sql_query를 보면은 왜 이렇게 하는지 알수 있을 겁니다. 결국 main의 인덱싱 되는 데이터의 범위를 정해주는 역할을 합니다.


  - source delta : main

    delta의 경우 main을 상속(?) 받습니다. 상속이라는 말이 맞는지 모르겠습니다. 하지만 여기서도 쿼리를 구성해서 실행을 하게 됩니다. 아래의 그림의 쿼리를 보게되면 main과 반대로 새로 들어온 데이터를 로드해오는것을 알수 있습니다. 결국 delta의 경우 최신 데이터를 가지고 있게 됩니다.


  중요한 부분은 여기까지입니다 그리고 나머지는 index 부분이 있는데 이 부분은 경로 및 charset_ 등을 셋팅해주는 작업이니 첨부된 config 파일을 보시면 알수 있을 듯 합니다.


5. 사용

  config가 셋팅이 됐다면 이제 해야 할 일은 indxer를 이용해 인덱싱 하는 일만 남았습니다.

  bash$ indexer main

  bash$ indexer delta


  데이터를 삽입 후

  bash$ indxer delta

  bash$ indexer --merge main delta --rotate


  ※ 저 같은 경우 위의 경우를 하는데 에러가 나서 한참 삽질을 했는데요. 결국 원인은 config 셋팅 문제 였습니다. 만일 안된다고 하시면 config 셋팅 부분을 다시 한번 살피시는게 좋을듯 합니다.


  위와 같이 indexer를 이용해 merge 한 후 search를 이용해 검색을 하게 되면 아래와 같이 main과 delta 두 군데에서 결과를 얻을수 있게 됩니다. 만약 데이터가 한쪽에만 있다고하면 한쪽에서 검색이 됩니다.


 

이게 스핑크스(sphinx)에서 말하는 분산 인덱스 기능인듯 합니다. 여러개로 인덱스를 나눠 놓고 search를 할 경우 searchd에서 알아서 여러개의 인덱스 파일에서 데이터를 match 시켜 찾는 겁니다. 분산처리를 하게 될 경우 매우 유용할듯 하지만 현재 테스트 중인 저에게는 그다리 필요가 없네요^^;


6. 마치며

  config 셋팅 때문에 삽질좀 했습니다. 테스트 할것들이 한두개가 아닌데 테스트 할 부분 정리를 하다가 갑자기 reindexing이 생각이 나서 찾아서 만들어 본다는게 시간이 꾀 걸렸네요. 이 다음에는 시스템 리소스를 얼마나 효율적으로 사용을 할수 있는지 조사를 해봐야 할듯 합니다. 이 부분 빨리 테스트를 진행하고 api를 활용해서 검색 부분을 만들어봐야 할듯 합니다. 


1. 준비물

   1) 스핑크스(sphinx) 다운로드- http://sphinxsearch.com/downloads/

   2) MySQL 다운로드 - http://dev.mysql.com/downloads/


2. 설치

   1) 다운로드 받은 스핑크스 파일을 /usr/local/src/ 경로에 복사

   2) tar xvfz sphinx-2.0.1-beta.tar.gz 압축 해제

   3) 스핑스크 압축 해제 후 폴더로 이동

   4) ./configure

   5) make (조금 기다려야 합니다.)

   6) make install


   위의 6단계를 거치면 우선 스핑스크 설치는 완료입니다. 제대로 설치 됐는지 확인을 해봐야겠죠..?

 

3. 컴피그 셋팅 및 한글 셋팅

  - 우선 /usr/local/etc/을 확인 합니다.

   파일 리스트를 확인하게 되면

   example.sql - 샘플로 사용할 테이블 정보 및 데이터 정보 쿼리가 들어 있습니다.

   sphinx-min-conf.dist - 잘 모르겠네요..ㅎ

   sphinx.conf.dist - DB 정보, 캐릭터 셋 정보, 인덱스 정보 등의 설정 정보를 담고 있습니다.


   위 파일 중 sphinx.conf.dist의 데이터를 수정합니다.

  1) 우선 가상 상위단에 보게되면은 데이터 베이스 셋팅 정보 부분이 있습니다. 저 부분에 자신의 데이터 베이스 정보를 적어 줍니다.

 

2) index 부분에서 charset_type, castset_table을 수정해 줍니다. 이 부분을 셋팅해야 한글을 사용할수 있습니다.

아래와 같이 셋팅을 해줍니다.

charset_type = urf-8

charset_table = 0..9, A..Z->a..z, _, a..z, U+AC00..U+D7A3, U+1100..U+1159, U+1161..U+11A2, U+11A8..U+11F9

 

※ 한글을 사용하기 위해서는 DB 캐릭터 셋 정보 또한 utf-8로 셋팅을 해줘야 한다는 겁니다. 이거 때문에 검색이 안되서 고생좀 했습니다.

 

우선 이렇게 하면은 기본 설정은 완성 됐습니다.

 

- 이번에는 /usr/local/bin/ 폴더로 이동합니다.

이곳에 이것저것 툴이 깔려 있습니다. 그중 바로 사용해 볼 것들은 indexer와 searchd 입니다.

우선 indxer는 위에서 설명한 컨피그 파일에서 셋팅된 쿼리와 DB 정보를 이용해 데이터를 가져와 document로 만들어 인덱싱 하게 됩니다. 이 과정을 거쳐야 검색을 할수 있게 됩니다.

1) searchd

 파일명 뒤에 d가 붙어 있죠. 이걸보면 대부분 아실거라 생각합니다. 이건 데몬 프로그램입니다. 이녀석이 하는일이 뭐냐 하면 백그라운드로 돌면서 스핑크스에서 제공해주는 API로 쿼리를 만들어 던져주면 그 쿼리를 처리하는 역할을 합니다. 그러니 PHP, JAVA, Ruby 등등 으로 API를 호출해서 검색을 하게 될 경우 이녀석은 항상 켜져 있어야 합니다.

 

2)indexer

 우선 indexer를 실행 하기 전 mkdir /var/data/ 폴더를 생성해 줍니다. 현지 컴피그 파일에 아마 저 경로로 셋팅이 되어있을 겁니다. 저 경로가 싫으신 분들은 컨피그 파일에서 셋팅 정보를 변경한뒤 디렉토리를 생성해 주시면 됩니다.

 

indexer [인덱싱 이름]

위와 같이 쳐주면 됩니다. 인덱싱 이름 같은 경우 임의로 정해주시면 됩니다.

저는 test1로 인덱싱 이름을 정했습니다. 그리고 테이블에 더미데이터로 900만건 정도의 데이터를 넣고 테스트를 진행했습니다. (C++로 제작되서 빠르다길래....) 그랬더니 1분 40초 가량이 걸리더군요. 현재 루신으로 테스트를 안해봐서 이게 빠른건지 모르겠습니다. 루신도 시간되는데로 테스트를 해봐야 할것 같습니다.

 

자~ 이렇게 되면은 검색할 준비가 다 됐습니다. 이제부터는 스핑크스에서 제공해주는 API로 구현된 샘플 코드들을 이용해서 검색을 해도 되고, 툴을 이용해서 해도 됩니다.

 

참고로 샘플 코드를 이용하려 한다면 PHP, JAVA 등이 될수 있는데요. JDK, PHP를 따로 설치를 해주셔야 합니다. 저는 우선 테스트를 위해 모두 설치를 해놨습니다.

 

- 검색 : 이런식으로 뜹니다. 900만건 정도의 데이터에서 검색을 해서 그런지 몰라도 속도는 빠르더군요. 거의 바로 뜹니다.


여기까지 설치 및 한글 셋팅 정보 입니다. 우선 이 부분들은 나중에 제가 보기 위해서 정리를 해놓으거니까 더 많은 내용이 필요하신 분들은 구글링.... 해주세요~ㅋ

'Search Engine > Sphinx' 카테고리의 다른 글

스핑크스 설정  (0) 2012.06.05
[설치/설정] 검색엔진]sphinx quick start  (0) 2012.02.13
Sphinx  (0) 2012.02.13
sphinx 검색엔진 한글 검색 설정  (0) 2012.02.13
스핑크스(sphinx) 검색 엔진 reindex  (1) 2012.02.13

+ Recent posts