SW 개발/Spring

CentOS, Sphinx 3, 오픈 소스 풀텍스트 검색 서버 설치하기

지단로보트 2020. 3. 22. 22:58

개요

  • Sphinx(스핑크스)는 C++ 기반의 무료 오픈 소스 풀텍스트 검색 서버이다. Sphinx의 장점은 쉬운 설치와 사용법에 있다. 특히, 애플리케이션 입장에서는 기존의 MySQL/MariaDB와 동일한 방법으로 스핑크스에 연결하여 SQL과 유사한 쿼리로 인덱스에 대한 CRUD를 수행할 수 있어 매우 편리하다. (이러한 접근 방식을 SphinxQL이라 부른다.)

Sphinx 3 설치

  • 아래는 CentOS 7 운영체제에 Sphinx 3(2020-01-31에 공개된 3.2.1 기준)를 설치하는 예이다. 가장 먼저 로컬에 위치한 Sphinx에서 MySQL/MariaDB 원격 서버에 연결하기 위한 클라이언트를 설치할 차례이다.
### 인덱스 대상이 되는 MySQL/MariaDB 원격 서버에 연결하기 위한 클라이언트를 설치
$ cd /opt
$ sudo yum group install "Development Tools"
$ sudo yum install MariaDB-devel MariaDB-shared
$ export LD_LIBRARY_PATH=/usr/lib64/mysql
$ sudo ln -s /usr/lib64/mysql/libmysqlclient.so.18.0.0 /usr/lib64/msyql/libmysqlclient.so
$ sudo nano /etc/ld.so.conf
/usr/lib64/mysql

$ sudo ldconfig
  • 이제 Sphinx 3 바이너리를 설치할 차례이다.
$ sudo wget http://sphinxsearch.com/files/sphinx-3.2.1-f152e0b-linux-amd64-glibc2.12.tar.gz
$ sudo tar xvfz sphinx-3.2.1-f152e0b-linux-amd64-glibc2.12.tar.gz
$ cd sphinx-3.2.1

Sphinx 3 인덱스 정책 작성

  • 가장 중요한 인덱스 정책을 작성할 차례이다.
$ sudo mkdir /var/data
$ sudo cp -rf /opt/sphinx-3.2.1/etc/sphinx.conf.dist /etc/sphinx/sphinx.conf
$ sudo nano /etc/sphinx/sphinx.conf
source foobar
{
  type = mysql
  sql_host = localhost
  sql_user = test
  sql_pass =
  sql_db = test
  sql_port = 3306
  sql_query_pre = SET NAMES utf8
  # 풀텍스트 인덱스를 생성할 원격지 테이블에 대한 조회 쿼리를 작성
  sql_query = \
    SELECT id, field_1, field_2, UNIX_TIMESTAMP(created_at) AS created_at \
    FROM foobar
  # 풀텍스트 검색의 대상이 되는 컬럼을 지정
  sql_field_string = field_1
  sql_field_string = field_2
  sql_attr_timestamp = created_at
  sql_ranged_throttle = 0
}

index foobar
{
  source = foobar
  path = /var/data/foobar
  docinfo = extern
  dict = keywords
  mlock = 0
  morphology = none
  html_strip = 0
  charset_table = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F
  min_word_len = 1
  min_infix_len = 1
  min_prefix_len = 0
  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
}

Sphinx 3 데몬 실행

  • 마지막으로 앞서 작성한 인덱스 정책을 적용하여 Sphinx 3 데몬을 실행할 차례이다.
### 전체 인덱스를 새롭게 생성, 기존 생성된 인덱스를 무시
$ sudo /opt/sphinx-3.2.1/bin/indexer --config /etc/sphinx/sphinx.conf --all

### 추가로 발생한 데이터에 대해서만 인덱스에 추가 생성
$ sudo /opt/sphinx-3.2.1/bin/indexer --config /etc/sphinx/sphinx.conf --all --rotate

### Sphinx 검색 엔진을 실행
$ sudo /opt/sphinx-3.2.1/bin/searchd --config /etc/sphinx/sphinx.conf

Sphinx 3 검색

### 로컬에 실행 중인 Sphinx 검색 엔진에 연결
$ mysql -h0 -P9306

### `푸바` 문자열이 포함된 모든 로우를 반환
> SELECT * FROM foobar WHERE MATCH('푸바');

### field_1 컬럼에 `푸바` 문자열이 포함된 모든 로우를 반환
> SELECT * FROM foobar WHERE MATCH('@field_1 푸바');

### `푸바` 문자열이 포함된 모든 로우를 반환, field_1 컬럼에 더 높은 가중치를 부여
> SELECT * FROM foobar WHERE MATCH('푸바') OPTION FIELD_WEIGHTS=(field_1=2, field_2=1);

참고 글