Service sphinx lnw
- gentoo 에서 sphinx 를 local pockage 로 세팅하기
사전준비
이 내용은 요기 를 기반으로 전개한다. 기본적인 사용법은 요기 문서를 통해 미리 익혔을것이라 가정하고 진행한다.
기존의 문서내용은 gentoo 에 있는 패키지를 사용하는것이 주 내용이 아니다. 따라서 이 문서는 gentoo 에 있는 패키지를 주로 사용하는 전제 조건을 가진다.
미리 검색엔진에 사용할 dictionary 파일은 text 파일의 형태로 준비해놓기를 권장한다. 물론 UTF-8 NFC 여야 한다.
이 내용은 다음과같은 디렉토리 구조를 가진다는 것을 참고해야 한다.
- /usr/local/search
- 본 내용의 주 설치 패키지들이 이 디렉토리 아래쪽에 위치하게 된다.
- /var/log/sphinx
- sphinx 검색엔진의 log 가 들어간다
- /var/lib/sphinx/data
- sphinx 관련된 데이터들이 들어간다
이 문서에서 필요한 패키지가 있다. 사전에 미리 설치하면 좀더 편하다. 버전은 크게 상관이 없다.
- boost-build
- boost
- postgresql
- USE FLAG 에서 "server"는 제거하는것이 좋다
- mms-agent
- mongo-tools
- mongodb
사전에 필요한 패키지의 설치
emerge /usr/portage/dev-util/boost-build/boost-build-1.57.0.ebuild
emerge /usr/portage/dev-libs/boost/boost-1.57.0.ebuild
USE="-server" emerge -pv postgresql
emerge /usr/portage/app-admin/mms-agent/mms-agent-3.6.0.201_p1.ebuild
emerge /usr/portage/app-admin/mongo-tools/mongo-tools-3.0.5.ebuild
emerge scons
USE="mms-agent" emerge -pv mongodb
어렵지 않다.. gentoo 의 사용법대로 간단하게 설치를 진행하면 된다.
ebuild 파일이 버전업되어 존재하지 않는 경우라면 gentoo 에서 권장하는 버전을 설치하면 된다.
필요한 디렉토리의 준비
다음의 명령어를 통해 필요한 디렉토리들을 미리 준비한다
mkdir /var/log/sphinx
mkdir /var/lib/sphinx
mkdir /var/lib/sphinx/data
mkdir /usr/local/search
mkdir /usr/local/search/bin
mkdir /usr/local/search/lib
sphinx 패키지 및 mongo driver 의 설치
패키지를 빌드하는 디렉토리는 "/usr/src/" 로 정한다. 패키지 파일을 미리 준비해놓는것이 좋다.
cd /usr/src/
tar xvf sphinx_build.tar
cd ./sphinx_build
mongodb c driver 의 설치
다음과 같은 방법으로 mongodb c driver 를 설치한다.
cd sphinx_onion_branch/mongo-c-driver
./configure --prefix=/usr/local/search/mongo_driver/
make ; make install
설치는 간단하다.
mongodb cxx driver 의 설치
다음과 같은 방법으로 mongodb cxx driver 를 설치한다.
cd sphinx_onion_branch/mongo-cxx-driver
scons --prefix=/usr/local/search/mongo_driver/ install
sphinx 의 설치
다음과 같은 방법으로 sphinx 검색엔진을 설치한다.
cd /usr/src/sphinx_build/sphinx_onion_branch/sphinx
./configure --prefix=/usr/local/search/sphinx --without-odbc --without-mysql --with-pgsql --with-pgsql-includes=/usr/include/postgresql-9.5/ --with-pgsql-libs=/usr/lib64/postgresql-9.4/lib64/ --with-mongoc --with-mongoc-includes=/usr/local/search/mongo_driver/include --with-mongoc-libs=/usr/local/search/mongo_driver/lib
make clean ; make ; make install
검색엔진의 설치는 이와 같이 간단하다. 검색엔진의 설치가 종료되면 사전파일과 데이터가 들어갈 디렉토리를 생성한다.
mkdir /usr/local/search/sphinx/dict
mkdir /usr/local/search/sphinx/data
검색엔진 설치후 후처리작업
cd /usr/local/search/lib
ln -s /usr/local/search/mongo_driver/lib/libbson-1.0.so ./
ln -s /usr/local/search/mongo_driver/lib/libmongoc-1.0.so ./
ln -s /usr/local/search/mongo_driver/lib/libmongoc-priv.so ./
ln -s libbson-1.0.so libbson-1.0.so.0
ln -s libmongoc-1.0.so libmongoc-1.0.so.0
cd /usr/local/search/bin
ln -s /usr/local/search/sphinx/bin/indexer ./
ln -s /usr/local/search/sphinx/bin/indextool ./
ln -s /usr/local/search/sphinx/bin/mkdict ./
ln -s /usr/local/search/sphinx/bin/search ./
ln -s /usr/local/search/sphinx/bin/searchd ./
ln -s /usr/local/search/sphinx/bin/spelldump ./
ln -s /usr/local/search/sphinx/bin/wordbreaker ./
이처럼 설치된 패키지의 디렉토리에 필요한 파일들을 link 하게 되면, 이후 library 의 path 를 잡아주어야 한다.
/etc/env.d/ 안쪽에 파일을 하나 만들고 다음의 내용을 넣어준다
LD_LIBRARY_PATH="/usr/local/search/lib"
다음의 명령어를 통해 추가한 Library path 를 시스템에 적용한다.
env-update ; source /etc/profile
후반작업
mongodb 의 시작
/etc/init.d/mongodb start
아무것도 할건 없다. 그냥 시작만 해주면 된다.
dictionary 작업
다음과같은 작업을 통해 이미 준비된 txt 파일을 sphinx 에 dictionary 로 추가한다.
./mkdict words.txt /usr/local/search/sphinx/dict/system.dict
검색엔진의 시작
sphinx 의 작동을 위해 sphinx 의 검색엔진 daemon 을 실행시켜야 한다. log 파일을 보며 디버깅을 하기위해 다음과 같은 명령어로 searchd 를 작동시킨다.
cd /usr/local/search/bin
/usr/local/search/bin/searchd --logdebugvv
index 관리용 스크립트 파일의 세팅
mk_index.sh 라는 이름의 스크립트를 /usr/local/search/bin/ 안쪽에 아래와 같은 내용으로 넣어준다
#!/bin/bash
MONGO_ROOT="/usr"
SPHINX_ROOT="/usr/local/search/sphinx"
TIME_STR=`date +"%Y-%m-%d %H:%M:%S"`
TIME_PATH="$SPHINX_ROOT/etc/last_index"
LAST_TIME_STR=`cat $TIME_PATH` 2>/dev/null
if [[ $LAST_TIME_STR = '' ]]; then
LAST_TIME_STR="0000-00-00 00:00:00";
fi
if [[ $1 = '-f' ]]; then
LAST_TIME_STR="0000-00-00 00:00:00";
fi
echo $LAST_TIME_STR
echo $TIME_STR > $TIME_PATH
echo "LAST TIME : $LAST_TIME_STR"
TEMPLATE=$SPHINX_ROOT/etc/sphinx.conf.template
COMMONS=$SPHINX_ROOT/etc/sphinx.conf.commons
CONF1=$SPHINX_ROOT/etc/sphinx1.conf
CONF2=$SPHINX_ROOT/etc/sphinx2.conf
CONF=$SPHINX_ROOT/etc/sphinx.conf
cp $TEMPLATE $CONF1
perl -p -i -e "s/\{\{LAST_TIME\}\}/0000-00-00 00:00:00/g" $CONF1
perl -p -i -e "s/\{\{SUFFIX\}\}//g" $CONF1
cp $TEMPLATE $CONF2
perl -p -i -e "s/\{\{LAST_TIME\}\}/$LAST_TIME_STR/g" $CONF2
perl -p -i -e "s/\{\{SUFFIX\}\}/_inc/g" $CONF2
cat $CONF1 > $CONF
cat $CONF2 >> $CONF
cat $COMMONS >> $CONF
rm -f $CONF1 $CONF2
RUNNING=`ps -ef | grep 'indexer module_search_total' | grep -v grep`
if [[ "$RUNNING" = '' ]]; then
if [[ $1 = '-f' ]]; then
$SPHINX_ROOT/bin/indexer module_search_total --rotate
else
$SPHINX_ROOT/bin/indexer module_search_total_inc --rotate
$MONGO_ROOT/bin/mongo --eval "\
var con=new Mongo(); \
var db=con.getDB('sphinx'); \
var cursor=db.module_search_total_inc.find({}); \
while(cursor.hasNext()) { \
var row = cursor.next(); \
db.module_search_total.update({_id:row._id},row,{upsert:true}); \
}\
db.module_search_total_inc.remove({});"
$SPHINX_ROOT/bin/indexer --merge module_search_total module_search_total_inc --rotate
fi
rm -f $SPHINX_ROOT/data/module_search_total_inc.*
else
echo "Found Another Indexing Process"
fi
이 스크립트 파일의 사용법은 간단하다.
- 그냥 실행하게 되면 index 를 갱신만 한다.
- -f 옵션을 주고 실행하면 index 를 지우고 바닥부터 갱신한다.
처음 사용해본다면 -f 를 통해 index 를 처음부터 생성해주기 바란다.
외부에서 검색엔진에 정상적으로 접근이 된다면 성공이다.