본문 바로가기

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

[Sphinx] 검색 엔진 Sphinx 4부 - 인덱싱 설정과 데몬 설정

반응형
소개



3부에서는 검색을 통해 결과값을 가져왔다.

이제 4부에서는 데이터를 인덱싱하는 방법과, 데몬 등록을 통한 주기적인 인덱싱 설정을 통해, Sphinx의 인덱스 데이터를 유지 하는 방법을 다루겠다.


명령어를 PATH에 등록하지 않았다면 아래 링크를 통해서 등록을 해주거나, 

2013/06/22 - [Linux Debian 7] - [Debain] 어느 위치에서든 프로그램 실행시키도록 PATH 설정하기

아래처럼 명령어가 있는 디렉토리에가서 명령어를 실행하면 된다.

cd /usr/local/sphinx/bin

./indexer --all --rotate --merge --quient --silent --config




전체 인덱싱



전체 인덱싱은 말 그대로, 환경설정에 있는 모든 인덱스를 인덱싱 하는 것이다.

indexer --all


만약, SphinxQL을 사용하기 위해, 혹은 서비스 제공을 위해 searchd 프로세스를 실행시켰다면, 항상 --rotate를 추가로 붙여주면 된다. 그렇지 않다면 에러가 발생할 것이다.

indexer --all --rotate


전체 인덱싱은 모든 인덱스의 데이터를 인덱싱하기때문에 인덱스의 크기와 데이터의 크기에 의해 시간이 결정될 것이다.

(main + delta 방식인 경우 전체 인덱싱 하고나서 merge 명령어를 해줘야 delta에서 인덱싱된 데이터를 Sphinx에 반영하게 된다.)




부분 인덱싱



환경설정에 설정된 인덱스 리스트가 많다면, 전체 인엑스보다는 특정 인덱스만을 인덱싱 함으로서 시간을 줄일 수 있다.

indexer 인덱스명


예를 들면, 예제에서 제공된 sphinx.conf에는 zipcode, book, delta, shop이라는 4가지의 인덱스가 있다.

이 이름을 통해 인덱싱을 하면 되는 것이다.

indexer delta




인덱스 업데이트 (Delta Index Updates)



인덱스 업데이트는 3가지가 있다.

위에 나온 것처럼 데이터가 적은경우 전체 또는 부분 인덱싱을 통해 인덱스 전체를 처음부터 다시  생성하는 방법과 라이브 인덱싱, 그리고 Delta 방식 인덱싱이 있다.

여기서는 Delta 업데이트 방법을 소개한다.


Delta 업데이트는  Main + Delta 방식으로, 먼저 주된 인덱스를 Main이 갖게하고, MySQL에 추가된 데이터를 Delta에서 인덱싱 하도록 한다.

그리고나서 Delta의 데이터를 Main에 건네주어 데이터를 합친다.

따라서 추가된 데이터만 인덱싱하면 되므로 인덱스 전체를 인덱싱 할 필요가 없다.


예제로 첨부한 sphinx.conf에 있는 인덱스들 중에 shop 인덱스가 Delta 업데이트 방식을 사용한다.

 source shop

 {

         type                    = mysql


         sql_host                = localhost

         sql_user                = debian

         sql_pass                = anne$1929

         sql_db                  = test

         sql_port                = 3306  # optional, default is 3306

         sql_sock                = /tmp/mysql.sock


         sql_query_pre = SET NAMES utf8

         sql_query = SELECT sn, price, price AS s_price, pack_count, item_name, npc_name FROM shop WHERE sphinx_yn='Y'


         sql_attr_bigint         = price

         sql_field_string        = s_price

         sql_field_string        = pack_count

         sql_field_string        = item_name

         sql_field_string        = npc_name


 #       sql_query_info          = SELECT * FROM shop WHERE sn=$id

 }


 source delta : shop

 {

         sql_query_pre = SET NAMES utf8

         sql_query = SELECT sn, price, price AS s_price, pack_count, item_name, npc_name FROM shop WHERE sphinx_yn='N'

         sql_query_post = UPDATE shop SET sphinx_yn='Y' WHERE sphinx_yn='N'

         sql_query_killlist = SELECT sn FROM shop WHERE sphinx_yn='D'

 }



 index shop

 {

         source                  = shop

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

         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


          ...

          ...


 }

 index delta : shop
 {
         source                  = delta
         path                    = /usr/local/sphinx/var/data/dalta
         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

          ...
          ...

 }



설정을 보면 main + delta에서 main에 해당하는 것이 shop다. 그리 delta에 해당하는 것이 delta이다.

자심 아래의 쿼리 일부분을 보면 아래처럼 되어 있다.


main의 sql_query : ... WHERE sphinx_yn='Y'

delta의 sql_query : ... WHERE sphinx_yn='N'

delta의 sql_query_post : UPDATE shop SET sphinx_yn='Y' WHERE sphinx_yn='N'


즉, MySQL에서 main이 인덱싱하는 부분은 Y값이고 delta에서 인덱싱 하는 부분은 N값 부분이다.

그리고 delta가 인덱스를  마치면 sql_query_post를 통해 N값을 Y값으로 바꿔줌으로서 다시는 delta 인덱싱할때 인덱스 범위에 잡히지 않도록 해준다.

이로서 추가된 데이터를 인덱스하는 것이다.


다음은 이 과정을 명령어로 나타낸 것이다. (서비스중이면 --rotate 추가할 것)


1. delta 인덱싱

indexer delta


2. main + delta 인덱스 데이터 합치기

indexer --merge shop delta



만약 MySQL에서 일부 데이터가 변경된 것을 Sphinx에 반영하려면 변경된 데이터의 sphinx_yn값을 delta에서 인덱싱 할 수 있도록 Y값을 N값으로 변경만 해주면 데이터를 업데이트 할 수 있다.


만약, MySQL의 데이터중 일부가 삭제 됐다면, 전체, 혹인 부분 인덱싱을 해야한다. 하지만 삭제하기전에 Sphinx에서 데이터를 먼저 빼도록 할 수 있다.

바로 delta의 sql_query_killlist가 그 역할을 한다.

delta의 sql_query_killlist : SELECT sn FROM shop WHERE sphinx_yn='D'

sphinx_yn의 값을 D로 해두면, killlist의 인덱스 범위내로 들어온다. 이때, 인덱스의 기준이 되는 id값을 넘겨주기만 하면 된다. (여기 예제에서는 id가 sn값이다.)

이제 delta를 인덱싱하고 merge지를 하면 데이터가 사라져있다.




시작 등록



리눅스가 재시작 했을 경우 Sphinx가 자동으로 서비스를 시작하게 만들기 위해서 간단한 쉘스크립트를 등록 해야한다.


먼저, 시작할 스크립트는 init.d에 위치해 있어야 하므로 디렉토리를 이동한다.

cd /etc/init.d

vi searchd



파일 내용은 아래처럼 적는다. (만약 환경 설정이 기본디렉토리에 없다면, --config 옵션으로 환경설정 위치를 잡아주도록 한다.)

#!/bin/bash

/usr/local/sphinx/bin/searchd





시스템이 파일에 접근 가능토록 권한을 설정한다.

chmod 755 searchd



이제 데비안을 재시작해도 searchd가 자동으로 시작된다.

만약 서비스로도 만들고 싶다면 다음 글을 참고 한다.

2013/05/04 - [Linux Debian 7] - [Debian] 부팅시 script 및 서비스 시작하도록 등록하기




Crontab 등록



일정 시간마다 업데이트를 해야 할 경우 crontab에 등록하여 업데이트를 실행시킬 수 있다.


1. 전체 업데이트

먼저 전체 업데이를 만들기 위해 Shellscript를 만들도록 하자.

cd /usr/local/sphinx/bin

vi sphinx_total_updater.sh


sphinx_total_updater.sh 내용에는 아래처럼 전체 업데이트 명령어를 넣도록 한다.

#!/bin/bash

/usr/local/sphinx/bin/indexer --all --rotate

sleep 2

/usr/local/sphinx/bin/indexer --merge shop delta --rotate 




2. 부분 업데이트

부분적으로 업데이트를 하기 위해 Shellscript를 만들도록 하자.

cd /usr/local/sphinx/bin

vi sphinx_partial_updater.sh


sphinx_partial_updater.sh 내용에는 아래처럼 부분 업데이트 명령어를 넣도록 한다.

#!/bin/bash

/usr/local/sphinx/bin/indexer delta --rotate

sleep 2

/usr/local/sphinx/bin/indexer --merge shop delta --rotate 



3. Crontab 등록

crontab -e


만든 스크립트 경로를 통해 크론을 실행하도록 한다. (아래의 예는 매 분마다 실행한다.)

* * * * * /usr/local/sphinx/bin/sphinx_total_updater.sh

* * * * * /usr/local/sphinx/bin/sphinx_partial_updater.sh 


일정한 시간 설정 등은 다음 링크를 참고하도록 한다.

2013/01/09 - [Linux] - [Linux] crontab




이상으로 Sphinx 검색 엔진을 통해 데이터를 인덱싱하고, 업데이트 및 삭제 그리고, 리눅스가 알아서 업데이트 되도록 했다.

다음 5부에서는 웹서비스를 위해 PHP와의 연결 부분을 다루겠다.




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

2013/05/31 - [Database/Sphinx 검색엔진] - [Sphinx] 검색 엔진 Sphinx 2부 - Sphinx와 MySQL 연동 및 테스트

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

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



반응형