본문 바로가기

데비안 리눅스 설치 가이드/Sphinx 검색 엔진

[Sphinx] 검색 엔진 Sphinx 2부 - Sphinx와 MySQL 연동 및 테스트

반응형

소개


1부에서 설치에 이어 2부에서는 Sphinx와 MySQL을 연동해보고 MySQL처럼 쿼리문을 통해 간단한 검색을 해보도록 하자.

참고로 내용이 많아 보이나 복잡하진 않다.



1. SQL 데이터 삽입


우선 간단한 테스트를 위해 아래의 파일을 받아 MySQL에 넣도록 한다.

(Sphinx에서 제공하는 example.sql은 데이터가 영어로만 되어 있으므로 한글 테스트가 안된다. 각자 알아서 참고 자료로 활용하도록 한다.)



test.sql




아래의 명령어를 통해 test DB에 데이터를 넣도록 한다.

만약 test DB가 없다면, 수동으로 만들어줘야 한다. 만약 다른 DB에 넣고 싶다면 test명을 바꾸면 된다.

좀더 자세한건 2013/06/21 - [Database/MySQL] - [MySQL] MySQL DB와 Table 백업 및 복원 관리 글을 읽도록 하자.


mysql -u아이디 -p test < test.sql



참고로 SQL 예제 데이터는 아래와 같은 내용이며, 데이터는 인터넷에 떠도는 SQL 파일을 예제에 맞게 수정하였다.






2. Sphinx 설정



sphinx.conf 파일을 설정하는데 조금 많은 내용이 있다.

이제 설정파일을 어떻게 설정할지 최대한 간단하게 설명하겠다.


아래 내용중 다루지 않은 설정이 있으니 첨부된 파일이나, 더보기를 통해 확인하여 예제를 진행하도록 한다.




sphinx.conf




1. 설정파일 열기


설정 파일을 연다.

vi /usr/local/sphinx/etc/sphinx.conf



2. source 설정


sphinx.conf 내용중 source 부분이다.

source zipcode

{

type = mysql


sql_host = localhost

sql_user = DB아이디

sql_pass = DB패스워드

sql_db = DB명

sql_port = 3306 # optional, default is 3306

sql_sock = /tmp/mysql.sock


sql_query_pre = SET NAMES utf8

sql_query = SELECT sn, zipcode, state, city, suburb, address FROM zipcode 


sql_field_string = zipcode

sql_field_string = state

sql_field_string = city

sql_field_string = suburb

sql_field_string = address

}



source 부분에서는 인덱스명을 지정하고, 어떤 데이터를 인덱싱 할 것이지 등등 설정하는 부분이다.


source명 : zipcode (테이블명으로 하는 것이 편하다.)

sql_query_pre : 한글 데이터를 위해 utf8로 설정한다.

sql_query : 어떤 데이터를 인덱싱 하기 위해서는 MySQL로부터 데이터를 가져와야 한다. 자신이 Sphinx를 통해 검색 할 데이터 내용, 검색 결과에 표시할 내용을 포함하도록 MySQL 쿼리문을 작성하면 된다. 단, 첫번째 필드는 절대로 중복되지 않는 Primary Key 또는 Unique Key 값을 줘야 한다. 따라서 이런 필드가 없다면 DB에 만들어야 한다.

sql_field_string : Sphnx가 데이터를 다루기 위해 필요한 선언이라고 생각하면 된다. 즉, 데이터 타입을 지정해주는 것으로 int, string, float 등 이라고 생각하면 된다.

sql_field_string 외에 아래와 같은 데이터 타입이 있다.

sql_attr_uint

sql_attr_bigint

sql_attr_timestamp

...

...



일단은 정상적인 실행이 되는지 확인하기 위한 차원이므로 데이터 형태에 따른 차이와 그에대한 자세한 내용은 다음 3부에서 다루도록 하겠다. (중요하기 때문에 필수적으로 봐야 할 것이다.)




2. index 설정

index 설정에는 한글 설정, 검색 방법 등등의 설정을 다루게 된다.


sphinx.conf 내용중 index 부분이다.

index zipcode

{

source = zipcode

path = /usr/local/sphinx/var/data/zipcode

docinfo = extern

charset_type = utf-8

charset_table = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F


ngram_len = 1

ngram_chars =  U+4E00..U+9FBB, U+3400..U+4DB5, U+20000..U+2A6D6, U+FA0E, U+FA0F, U+FA11, U+FA13, U+FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27, U+FA28, U+FA29, U+3105..U+312C, U+31A0..U+31B7, U+3041, U+3043, U+3045, U+3047, U+3049, U+304B, U+304D, U+304F, U+3051, U+3053, U+3055, U+3057, U+3059, U+305B, U+305D, U+305F, U+3061, U+3063, U+3066, U+3068, U+306A..U+306F, U+3072, U+3075, U+3078, U+307B, U+307E..U+3083, U+3085, U+3087, U+3089..U+308E, U+3090..U+3093, U+30A1, U+30A3, U+30A5, U+30A7, U+30A9, U+30AD, U+30AF, U+30B3, U+30B5, U+30BB, U+30BD, U+30BF, U+30C1, U+30C3, U+30C4, U+30C6, U+30CA, U+30CB, U+30CD, U+30CE, U+30DE, U+30DF, U+30E1, U+30E2, U+30E3, U+30E5, U+30E7, U+30EE, U+30F0..U+30F3, U+30F5, U+30F6, U+31F0, U+31F1, U+31F2, U+31F3, U+31F4, U+31F5, U+31F6, U+31F7, U+31F8, U+31F9, U+31FA, U+31FB, U+31FC, U+31FD, U+31FE, U+31FF, U+AC00..U+D7A3, U+1100..U+1159, U+1161..U+11A2, U+11A8..U+11F9, U+A000..U+A48C, U+A492..U+A4C6





index명 : source명과 동일하게 해준다.

path : 인덱스한 파일이 저장되는 장소다. 위치는 상관없지만 데이터명은 쉽게 알아보기 위해 source명과 동일하게 처리해 주도록 한다.

charset_type : 한글 설정을 위해 utf-8로 해준다.

charset_table : sphinx.conf.dist 파일을 열어보면 utf-8 기본값으로 이미 위처럼 설정되어 있다. 그대로 복사해 사용한다.

ngram_len : 한글 검색을 위해 ngram을 설정해야 한다. 1값으로 설정한다.

ngram_chars : ngram을 검색하기 위해 나눌 단위를 설정한다. 한국어, 중국어, 일본어 모두 검색이 가능하도록 CJK를 사용하며 된다.

(CJK http://sphinxsearch.com/wiki/doku.php?id=charset_tables#cjk_ngram_characters)





3. rt 설정

rt를 이용하면 인덱싱된 데이터를 실시간으로 수정 할 수 있다는데, 사용해 본적이 없으며, 본 글에서 rt부분을 다루지 않으므로 패스한다. 
(그냥 기본으로 두거나, 삭제하거나 주석처리한다.)


sphinx.conf 내용중 type이 rt인 index 부분이다.

index zipcodert

{

type = rt

rt_mem_limit = 32M


path = /usr/local/sphinx/var/data/zipcodert

charset_type = utf-8


rt_field = state








2. Sphinx 인덱싱


MySQL로부터 검색 및 검색 결과를 줄 데이터를 Sphinx에서 검색이 되도록 인덱싱을 하도록 한다.
명령어는 indexer를 사용하면 된다.

indexer 명령어를 사용하기 위해 아래 위치로 이동한다.
만약 어느 위치에서든 indexer 명령어를 사용하려면 다음 글을 참고하도록 한다. 

2013/06/22 - [Linux Debian 7] - [Debain] PATH 설정

cd /usr/local/sphinx/bin


./indexer --all


아래와 같은 인덱싱 결과가 나타난다.




그외 아래와 같은 옵션이 있다.


--all : 설정된 모든 리스트를 인덱싱 한다.

--rotate : searchd 프로세스가 서비스 중일때 사용한다.
--merge : 인덱싱된 파일을 합친다.

자세한 사용은 나중에 설명하겠다.



3. SphinxQL 사용


MySQL처럼 Sphinx도 SphinxQL이라는 것이 있다.
이제 SphinxQL을 사용해서 검색이 정상적으로 되는지 확인하도록 하자.

우선 Sphinx에 접속하기 위해 searchd를 실행시키도록 한다. searchd가 중단되어 있다면 접속이 거부된다.

cd /usr/local/sphinx/bin

./searchd


접속하도록 한다.

mysql -h0 -P9306



SphinxQL은 MySQL의 쿼리문과는 조금 다르나 아주 기본적인 SELECT 문은 같으므로 일단 아래처럼 한다.

참고할 점은 FROM 뒤에 오는 Table명은 아까 sphinx.conf 설정에 사용했던 index명을 사용하면 된다는 점이다.



SELECT * FROM zipcode; 



이제 아래처럼 검색 결과가 나오면 Sphinx가 정상적으로 실행된 것이다.






Sphinx 3부에서는 SphixQL과 설정파일의 상세한 설정에 대해 설명하겠다.




2015.02.07 - Sphinx-2.2.7 버전 안내


2.2.7 버전에서 더 이상 charset_type 변수 설정 값이 사라졌습니다. 이제, Sphinx에서는 UTF-8 기준으로 지원한다고 하니, 더 이상 따로 UTF-8 설정을 하실 필요는 없고, 대신 DB 데이터 및 MySQL 설정이 UTF-8로 설정되었는지 확인해야 할 듯 합니다.




2013/05/20 - [Database/Sphinx 검색엔진] - [Sphinx] 검색 엔진 Sphinx 1부 - Sphinx 설치

2013/06/21 - [Database/Sphinx 검색엔진] - [Sphinx] 검색 엔진 Sphinx 3부 - SphinxQL 사용과 설정

2013/06/23 - [Database/Sphinx 검색엔진] - [Sphinx] 검색 엔진 Sphinx 4부 - 인덱싱 설정과 데몬 설정

2013/07/01 - [Linux Debian 7/Sphinx 검색 엔진] - [Debian] 검색 엔진 Sphinx 5부 - PHP와의 연결

반응형