Service sphinx lnw

From 흡혈양파의 인터넷工房
Jump to navigation Jump to search
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 를 처음부터 생성해주기 바란다.


외부에서 검색엔진에 정상적으로 접근이 된다면 성공이다.