Sphinx #1 :: 스핑크스 설치 및 환경설정

오픈소스 검색엔진 뭐 사용할까? 가벼운 스핑크스(Sphinx) 사용해보자 (인트로)
Sphinx #1 :: 스핑크스 설치 및 환경설정
sphinx #2 :: 스핑스크 쿼리 테스트 (sphinxQL + PHP연동)
sphinx #3 :: MySQL에서 스핑크스 직접 join하기 (sphinxSE)
sphinx #4 :: 스핑크스 주기적 인덱스 방법 (delta + crontab)
현재 mysql를 사용 중이며, 500만 건 text, varchar 등 혼합된 구조의 테이블이 10개 정도 존재합니다.
이들 대상으로 통합검색을 사이트에 구현해야 합니다.
몇가지 후보군 중에 스핑크스(sphinx)가 적당하다 판단하고 설치부터 테스트, 구현까지의 과정을 포스팅합니다.
아래는 스핑스크 테스트할 사용 계획입니다.
- mysql에는 zip_code라는 우편번호 테이블이 존재합니다.
- 스핑크스를 이용하여 zip_code의 text, varchar 컬럼을 인덱스 로드합니다. 인덱스 로드한 이름은 sph_zip_code로 명명합니다.
- sphinxQL 이용하여 쿼리 테스트를 합니다.
- sphinxSE 이용하여 zip_code와 sph_zip_code를 innser join 하여 통합검색 서비스를 합니다.
스핑크스의 다음 세 가지 액세스 방법 중 하나를 사용하여 검색데몬(searchd)에 액세스 할 수 있습니다.
- sphinxQL방식 : 스핑크스 자체의 mysql 네트워크 프로토콜 구현
- sphinxSE 방식 : 플러그인 가능한 스토리지 엔진이 있는 서버를 사용(ex: mysql)
- sphinxAPI방식 : 네이티브 검색 API 사용 (php, java 등)
계속 연재될 sphinx 포스팅에는 1, 2번을 집중으로 다룰것이며, 3번 방식은 설명하지 않습니다.
[설치 환경]
OS : centOS 7 64bit
mysql : mariaDB 10.2.18
sphinx : Sphinx 2.2.11-release
선행작업
스핑크스를 설치하기 이전에 반드시 mysql이 설치되어있어야 합니다.
정확히 말하면 스핑크스는 mysql이 필요가 없어도 됩니다.
하지만, 이 포스팅 자체가 mysql의 테이블을 스핑크스로 index를 만들고,
mysql에서 스핑크스를 연동하여 통합검색을 만드는게 목표이기 때문에 필요합니다.
위의 스핑크스 사용계획을 다시 읽어봐주세요.
mysql에 zip_code라는 테이블을 샘플로 설명이 되기 때문에 zip_code 테이블을 생성하고 데이터를 insert 해놔야 합니다.
아래는 발췌본이며 정확한 테스트를 위해서는 첨부파일에 올려놓은 zip_code.sql를 받아서 덤프해주세요.
sphinx 설치
]$ yum install postgresql-libs unixODBC # 설치파일 가져오기 (centOS7인경우..) ]$ wget -q http://sphinxsearch.com/files/sphinx-2.2.11-1.rhel7.x86_64.rpm # 스핑크스 설치 ]$ rpm -Uvh sphinx-2.2.11-1.rhel7.x86_64.rpm # 데이터(인덱스파일) 저장할 공간 만들기 ]$ mkdir /var/lib/sphinx/data
wget이 없다면 yum으로 설치하세요.
]$ yum install wget
wget 으로 rpm 가져올수 없으면 URL이 변경되었을 수도 있습니다. 직접 다운로드하세요.
Sphinx 2.2.11-release (r95ae9a6; Jul 19, 2016) --> RHEL/CentOS 7.x Source RPM 받았습니다.
sphinx 환경설정
환경설정 파일
]$ vi /etc/sphinx/sphinx.conf
하나씩 설명해보겠습니다.
source
############################################################################# ## source settings ############################################################################# source sph_zip_code { type = mysql sql_host = mysql ip주소 (localhost) sql_user = 계정명 sql_pass = 패스워드 sql_db = DB명 sql_port = 3306 sql_query_pre = SET NAMES utf8 sql_query_pre = SET SESSION query_cache_type=OFF sql_query = \ SELECT seq, zip_code, add1, add2, add3, address \ FROM zip_code sql_field_string = zip_code sql_field_string = add1 sql_field_string = add3 sql_field_string = address }
source 부분은 어떤 데이터를 인덱스 시킬것인지 설정하는 부분입니다.
mysql에는 zip_code라는 테이블이 존재하며, 스핑크스를 통해 인덱싱을 시킬 예정입니다.
- source명 : 실제 테이블이름앞에 "sph_" prefix 했습니다.
- sql_qurey_pre : sql_query 실행하기 전에 실행됩니다. 인코딩 설정, 내부 카운트 업데이트 등에 사용 할 수 있습니다.
- sql_query : mysql에서 인덱스를 걸고 싶은 쿼리를 작성하면 됩니다.
주의해야 할 점은 첫번째 컬럼은 반드시 정수타입의 Primary Key 또는 Unique Key를 작성해야 합니다. - sql_field_string : 열의 전체 텍스트 색인화하고 특성으로 지정할 수 있습니다.
sql_query 에서 작성한 컬럼을 인덱스를 생성시키고, sql_field_string 값을 표현 및 추후 where조건 절에서 사용할 수 있도록 해줍니다.
인덱스 걸고 싶은 컬럼은 그냥 설정하는걸로 합니다.
index
############################################################################# ## index settings ############################################################################# index sph_zip_code { source = sph_zip_code path = /var/lib/sphinx/data/sph_zip_code docinfo = extern 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 min_infix_len = 2 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 설정 부분입니다. 하나씩 살펴 보도록 하겠습니다.
- index명 : source명과 동일하게 합니다.
- source : source명 동일해야 합니다.
- path : 인덱스 설정할 경로를 설정합니다.
/var/lib/sphinx/data/
까지가 경로이고sph_zip_code
은 파일명이 됩니다.
참고로 인덱스 작업을 하면/var/lib/sphinx/data/
에 아래의 파일들이 생성됩니다.
-rw-r--r-- 1 root root 247268 12월 5 11:17 sph_bbs.spa
-rw-r--r-- 1 root root 31902 12월 5 11:17 sph_bbs.spe
-rw-r--r-- 1 root root 402996 12월 5 11:17 sph_bbs.spi
-rw------- 1 root root 0 12월 5 11:17 sph_bbs.spl
-rw-r--r-- 1 root root 4103471 12월 5 11:17 sph_bbs.spp
-rw-r--r-- 1 root root 7739914 12월 5 11:17 sph_bbs.sps
-rw-r--r-- 1 root root 0 12월 5 11:17 sph_bbs.spm
-rw-r--r-- 1 root root 0 12월 5 11:17 sph_bbs.spk
-rw-r--r-- 1 root root 1548 12월 5 11:17 sph_bbs.sph
-rw-r--r-- 1 root root 3740999 12월 5 11:17 sph_bbs.spd - docinfo : docinfo가 디스크와 RAM에 물리적으로 저장되는 방법을 저장합니다. 기본값은 extern입니다.
- charset_table, ngram_chars는 한글까지 검색되도록 하기 위해서는 똑같이 작성 해주세요.
- ngram_len : 1로 설정하면 됩니다. 한단어씩 색인됩니다.
좀더 자세한 내용을 원하시면 "ngram"을 구글에서 찾아보세요. - min_infix_len : 검색할때 반드시 매칭되어야 하는 최수 문자수
############################################################################# ## source settings ############################################################################# source sph_zip_code { type = mysql sql_host = mysql ip sql_user = mysql 계정 sql_pass = mysql 패스워드 sql_db = test sql_port = 3306 sql_query_pre = SET NAMES utf8 sql_query_pre = SET SESSION query_cache_type=OFF sql_query = \ SELECT seq, zip_code, add1, add2, add3, address \ FROM zip_code sql_field_string = zip_code sql_field_string = add1 sql_field_string = add3 sql_field_string = address } ############################################################################# ## index settings ############################################################################# index sph_zip_code { source = sph_zip_code path = /var/lib/sphinx/data/sph_zip_code docinfo = extern 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 min_infix_len = 2 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 } ############################################################################# ## indexer settings ############################################################################# indexer { mem_limit = 128M } ############################################################################# ## searchd settings ############################################################################# searchd { listen = 9312 listen = 9306:mysql41 log = /var/log/sphinx/searchd.log query_log = /var/log/sphinx/query.log read_timeout = 5 max_children = 30 pid_file = /var/run/sphinx/searchd.pid seamless_rotate = 1 preopen_indexes = 1 unlink_old = 1 workers = threads # for RT to work binlog_path = /var/lib/sphinx/ }
중간 정리해봅시다.
- 스핑크스 설치 (완료)
- 환경설정 :: sphinx.conf (완료)
- 인덱싱 실행 :: indexer --all
- 데몬 실행 :: searchd
- sphinxQL 실행 :: mysql -h0 -P9306
- 데몬 실행 중 재 인덱싱 :: indexer --all --rotate
indexer 실행
2번까지는 설명된 내용이고요, 환경설정한 sph_zip_code를 생성하기 위해서는 인덱싱 작업을 해줘야 합니다.
indexer는 전체 텍스트 인덱스를 만드는 유틸리티입니다.
만약 indexer 실행 시 WARNING을 만나셨다면 반드시 없애기 추천드립니다. 예기치 않은 검색결과가 나올 수 있습니다.
]$ indexer --all Sphinx 2.2.11-id64-release (95ae9a6) Copyright (c) 2001-2016, Andrew Aksyonoff Copyright (c) 2008-2016, Sphinx Technologies Inc (http://sphinxsearch.com) using config file '/etc/sphinx/sphinx.conf' ... indexing index 'sph_zip_code'... collected 52516 docs, 3.5 MB sorted 1.1 Mhits, 100.0% done total 52516 docs, 3483973 bytes total 0.337 sec, 10312158 bytes/sec, 155441.30 docs/sec .
데몬 실행
외부 소프트웨어(ex:php, mysql 등)가 스핑크스의 전체 텍스트 색인을 검색 할 수 있게 해주는 데몬입니다.
# 데몬실행 ]$ searchd Sphinx 2.2.11-id64-release (95ae9a6) Copyright (c) 2001-2016, Andrew Aksyonoff Copyright (c) 2008-2016, Sphinx Technologies Inc (http://sphinxsearch.com) using config file '/etc/sphinx/sphinx.conf'... listening on all interfaces, port=9312 listening on all interfaces, port=9306 precaching index 'sph_zip_code' precached 1 indexes in 0.005 sec # 구동확인 ]$ ps -ef | grep searchd root 25259 1 0 12:37 ? 00:00:00 searchd root 25260 25259 0 12:37 ? 00:00:00 searchd root 25270 23459 0 12:37 pts/1 00:00:00 grep --color=auto searchd .
[데몬 죽이기]
실행된 데몬을 죽이려면 kill 명령어를 사용해야 합니다.
]$ killall searchd 또는 ]$ killall -9 searchd
[indexer 재실행]
searchd가 실행중일때 indexer --all 를 실행하면 에러가 납니다. 아래의 명령어를 사용해야 합니다.
]$ indexer --all --rotate
sphinxQL 실행
]$ mysql -h0 -P9306 Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 2.2.11-id64-release (95ae9a6) Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL [(none)]> MySQL [(none)]> select * from sph_zip_code; +--------+--------+------------------+--------------------------------+ | id | add1 | add3 | address | +--------+--------+------------------+--------------------------------+ | 100011 | 서울 | 충무로1가 | 서울 중구 충무로1가 | | 100012 | 서울 | 충무로2가 | 서울 중구 충무로2가 | | 100013 | 서울 | 충무로3가 | 서울 중구 충무로3가 | | 100014 | 서울 | 충무로4가 | 서울 중구 충무로4가 | | 100015 | 서울 | 충무로5가 | 서울 중구 충무로5가 | | 100021 | 서울 | 명동1가 | 서울 중구 명동1가 | | 100022 | 서울 | 명동2가 | 서울 중구 명동2가 | | 100031 | 서울 | 저동1가 | 서울 중구 저동1가 | | 100032 | 서울 | 저동2가 | 서울 중구 저동2가 | | 100041 | 서울 | 남산동1가 | 서울 중구 남산동1가 | | 100042 | 서울 | 남산동2가 | 서울 중구 남산동2가 | | 100043 | 서울 | 남산동3가 | 서울 중구 남산동3가 | | 100051 | 서울 | 회현동1가 | 서울 중구 회현동1가 | | 100052 | 서울 | 회현동2가 | 서울 중구 회현동2가 | | 100053 | 서울 | 회현동3가 | 서울 중구 회현동3가 | | 100060 | 서울 | 남창동 | 서울 중구 남창동 | | 100070 | 서울 | 소공동 | 서울 중구 소공동 | | 100080 | 서울 | 북창동 | 서울 중구 북창동 | | 100091 | 서울 | 남대문로1가 | 서울 중구 남대문로1가 | | 100092 | 서울 | 남대문로2가 | 서울 중구 남대문로2가 | +--------+--------+------------------+--------------------------------+
마무리
설치 및 구동 테스트까지 완료 되었습니다.
다음으로는 sphinxQL에서 유용하게 사용될 쿼리를 살펴보도록 하겠습니다.
본 포스팅은 연재분이며, 아래와 같이 예상하고 있습니다.
Sphinx #1 :: 스핑크스 설치 및 설정하기
sphinx #2 :: sphinxQL 쿼리 테스트
sphinx #3 :: sphinxQL을 PHP에서 사용하기
sphinx #4 :: sphinxSE 설치 및 쿼리 테스트(inner join 가능)
http://sphinxsearch.com/docs/manual-2.2.11.html#extended-syntax
본 글은 나의 다른 블로그(폐쇄예정) 에서 작성한 글을 이관한 포스팅입니다. (2018년 12월 5일 작성)
'개발 > MariaDB' 카테고리의 다른 글
[MySQL] MySQL 리플리케이션 UUID 관련 에러 (0) | 2022.10.25 |
---|---|
sphinx #4 :: 스핑크스 주기적 인덱스 방법 (delta + crontab) (0) | 2022.10.25 |
sphinx #3 :: MySQL에서 스핑크스 직접 join하기 (sphinxSE) (0) | 2022.10.25 |
sphinx #2 :: 스핑스크 쿼리 테스트 (sphinxQL + PHP연동) (0) | 2022.10.25 |
오픈소스 검색엔진 뭐 사용할까? 가벼운 스핑크스(Sphinx) 사용해보자 (인트로) (0) | 2022.10.25 |
댓글
이 글 공유하기
다른 글
-
sphinx #4 :: 스핑크스 주기적 인덱스 방법 (delta + crontab)
sphinx #4 :: 스핑크스 주기적 인덱스 방법 (delta + crontab)
2022.10.25 -
sphinx #3 :: MySQL에서 스핑크스 직접 join하기 (sphinxSE)
sphinx #3 :: MySQL에서 스핑크스 직접 join하기 (sphinxSE)
2022.10.25 -
sphinx #2 :: 스핑스크 쿼리 테스트 (sphinxQL + PHP연동)
sphinx #2 :: 스핑스크 쿼리 테스트 (sphinxQL + PHP연동)
2022.10.25 -
오픈소스 검색엔진 뭐 사용할까? 가벼운 스핑크스(Sphinx) 사용해보자 (인트로)
오픈소스 검색엔진 뭐 사용할까? 가벼운 스핑크스(Sphinx) 사용해보자 (인트로)
2022.10.25
댓글을 사용할 수 없습니다.