-
[Search Engine] SphinxSearch Engine 2024. 8. 22. 20:02반응형
해당 포스팅에서는 Sphinx 검색엔진을 설치하고, 쿼리를 실행 해보겠습니다.
Sphinx란?
고성능, 오픈 소스 검색 엔진으로, 대량의 데이터를 신속하고 정확하게 검색할 수 있도록 설계된 시스템입니다. 특히 MySQL, PostgreSQL 같은 관계형 데이터베이스와의 통합이 뛰어나며, 다양한 애플리케이션에서 쉽게 사용할 수 있습니다.
Sphinx의 특징
- 빠른 검색 속도: Sphinx는 대용량 데이터에서도 매우 빠른 검색 성능을 자랑합니다. 이는 Sphinx가 데이터의 색인(Index)을 생성하고, 검색할 때 이 색인을 활용하여 속도를 극대화하기 때문입니다.
- 확장성: Sphinx는 수백만 개의 문서를 색인하고 검색할 수 있는 능력을 가지고 있어, 대규모 애플리케이션에서도 사용하기 적합합니다. 또한, 분산 검색을 지원하여 여러 서버에 걸쳐 작업을 분산시킬 수 있습니다.
- 유연한 통합: Sphinx는 MySQL, PostgreSQL 등의 데이터베이스와 쉽게 통합할 수 있습니다. 또한, SphinxQL이라는 자체 쿼리 언어를 제공하여 SQL과 유사한 방식으로 검색 쿼리를 작성할 수 있어, 기존의 데이터베이스 시스템과 자연스럽게 연결됩니다.
- 다양한 언어 지원: Sphinx는 다국어 검색을 지원하며, 한국어를 비롯한 여러 언어의 형태소 분석도 가능합니다. 이를 통해 여러 언어로 작성된 문서도 정확하게 검색할 수 있습니다.
- 실시간 색인 지원: Sphinx는 실시간 색인(Real-Time Indexing)을 지원하여, 데이터가 추가되거나 수정될 때 즉시 검색 가능하도록 반영할 수 있습니다. 이는 데이터가 자주 변경되는 애플리케이션에서 특히 유용합니다.
- 다양한 필터링과 정렬 기능: Sphinx는 검색 결과에 대해 다양한 필터링과 정렬 기능을 제공합니다. 이를 통해 사용자는 검색 결과를 원하는 대로 정렬하고 필터링할 수 있어, 검색의 정확도를 높일 수 있습니다.
Sphinx 사용 사례
Sphinx는 전 세계적으로 다양한 애플리케이션에서 사용되고 있습니다. 예를 들어, 대규모 전자상거래 사이트에서는 제품을 검색할 때 Sphinx를 사용하여 신속하고 정확한 검색 결과를 제공하고 있습니다. 또한, 포럼, 블로그, 뉴스 사이트 등에서도 Sphinx를 활용하여 사용자에게 빠른 검색 서비스를 제공합니다.
✍️ 목차
- 1. sphinx 설치
- 2. conf 파일 설정
- 3. Index
- 4. indexer 실행
- 5. searchd
- 6. SphinxQL
- 6-1. Sphinx MySQL 접속
- 6-2. 전체 조회
- 6-3. MATCH 조회
💡 환경
- MySQL 8.0.22 (Docker Container)
- Sphinx 3.5.1
- localhost
1. sphinx 설치
### download $ curl -O https://sphinxsearch.com/downloads/sphinx-3.5.1-82c60cb-darwin-amd64.tar.gz $ tar zxf sphinx-3.5.1-82c60cb-darwin-amd64.tar.gz $ cd sphinx-3.5.1/etc ### copy sample conf file $ cp sphinx-min.conf.dist sphinx.conf ### sphinx data directroy 생성 .../sphinx/sphinx-3.5.1 $ mkdir data && cd data $ mkdir binlog index log
2. conf 파일 설정
📘 sphinx.conf
... ############################################################################# ## source settings ## ############################################################################# common { datadir = /sphinx/sphinx-3.5.1/data/index/sph_store } source sph_store { type = mysql sql_host = mysql ip주소 (localhost) # docker container의 경우 127.0.0.1 sql_user = 계정명 sql_pass = 패스워드 sql_db = DB명 sql_port = 3306 sql_query_pre = SET NAMES utf8 sql_query = \ SELECT id, menu, dumy \ FROM store sql_field_string = menu sql_field_string = dumy }
source 부분은 어떤 데이터를 인덱스 시킬것인지 설정하는 부분입니다.
mysql에는 store라는 테이블이 존재하며, 스핑크스를 통해 인덱싱을 시킬 예정입니다.
각 옵션의 설명은 아래와 같습니다.
- datadir : 인덱스 설정할 경로를 설정합니다.
/sphinx/sphinx-3.5.1/data/index 까지가 경로이고 sph_store는 파일명이 됩니다.
참고로 인덱스 작업을 하면 /sphinx/sphinx-3.5.1/data/index 에 추가적인 파일들이 생성됩니다. - source명 : 실제 테이블이름앞에 "sph_"라는 prefix를 설정 했습니다.
- sql_qurey_pre : sql_query 실행하기 전에 실행됩니다. 인코딩 설정, 내부 카운트 업데이트 등에 사용 할 수 있습니다.
- sql_query : mysql에서 인덱스를 걸고 싶은 쿼리를 작성하면 됩니다.
주의해야 할 점은 첫번째 컬럼은 반드시 정수타입의 Primary Key 또는 Unique Key를 작성해야 합니다. - sql_field_string : 열의 전체 텍스트 색인화하고 특성으로 지정할 수 있습니다.
sql_query 에서 작성한 컬럼을 인덱스를 생성시키고, sql_field_string 값을 표현 및 추후 where조건 절에서 사용할 수 있도록 해줍니다.
3. Index
📘 sphinx.conf
############################################################################# ## index settings ## ############################################################################# index sph_store { source = sph_store 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명 동일해야 합니다.
- docinfo : docinfo가 디스크와 RAM에 물리적으로 저장되는 방법을 저장합니다. 기본값은 extern입니다.
- charset_table, ngram_chars는 한글까지 검색되도록 하기 위해서는 똑같이 작성 해주세요.
- ngram_len : 1로 설정하면 됩니다. 한단어씩 색인됩니다.
- min_infix_len : 검색할때 반드시 매칭되어야 하는 최수 문자수입니다. (최소값은 2 입니다.)
📘 sphinx.conf
############################################################################# ## source settings ## ############################################################################# ... ############################################################################# ## index settings ## ############################################################################# ... ############################################################################# ## indexer settings ## ############################################################################# indexer { mem_limit = 128M } ############################################################################# ## searchd settings ## ############################################################################# searchd { listen = 9312 listen = 9306:mysql41 log = query_log = read_timeout = 5 max_children = 30 # pid_file = /sphinx/sphinx-3.5.1/data/log/searchd.pid seamless_rotate = 1 preopen_indexes = 1 unlink_old = 1 workers = threads # for RT to work # binlog_path = /sphinx/sphinx-3.5.1/data/binlog/ }
sphinx 3.X.X 버전부터는 datadir 모드 사용시 log, query_log는 빈 값으로 입력합니다.
datadir 모드 사용시 binlog, pid_file도 무시 되기 때문에 주석처리 합니다.4. indexer 실행
[~/sphinx/sphinx-3.5.1/bin] $ ./indexer --all --config ../etc/sphinx.conf
만약 위 명령어를 실행했을때, “개발자를 확인할 수 없기 때문에 ‘indexer’을(를) 열 수 없습니다.” 라는 에러가 발생한다면,
아래 명령어를 실행해주세요.
$ chmod +x ./indexer $ xattr -d com.apple.quarantine ./indexer
위 명령어로 macOS의 Gatekeeper를 임시로 해제하여 실행 파일을 실행할 수 있습니다.
💡 만약 searchd가 실행중인 경우, indexer 실행시 --rotate 옵션을 추가해줘야 합니다.
indexer 실행시 위와 같이 index가 정상적으로 생성된 것을 확인할 수 있습니다.
5. searchd
[~/sphinx/sphinx-3.5.1/bin] $ ./searchd --config ../etc/sphinx.conf
searchd 데몬을 실행합니다. 이는 외부 소프트웨어(ex:php, mysql 등)가 스핑크스의 전체 텍스트 색인을
검색 할 수 있게 해주는 데몬입니다.
searchd 실행시 위와 같이 데몬이 정상적으로 생성된 것을 확인할 수 있습니다.
# 구동확인 ]$ ps -ef | grep searchd 501 12007 5542 0 11:14AM ttys001 0:00.01 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox searchd # searchd kill ]$ killall searchd 또는 ]$ killall -9 searchd
6. SphinxQL
인덱싱 된 데이터를 대상으로 데이터를 조회해보겠습니다.
6-1. Sphinx MySQL 접속
~/sphinx/sphinx-3.5.1/bin mysql -h0 -P9306 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 3.5.1 (commit 82c60cbfe) Copyright (c) 2000, 2021, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
6-2. 전체 조회
6-3. MATCH 조회
여기까지 Sphinx 엔진을 설치하고 각 설정 조회까지 진행해봤습니다.
이처럼 Sphinx는 강력한 검색 기능을 필요로 하는 애플리케이션에서 특히 유용한 도구입니다. 빠른 속도, 확장성, 유연한 통합 등 다양한 장점을 가지고 있어, 대규모 데이터베이스나 다국어 지원이 필요한 환경에서 효율적으로 사용할 수 있습니다. 오픈 소스이기 때문에 커뮤니티 지원도 활발하며, 필요에 따라 커스터마이징도 가능합니다.Reference:
https://sphinxsearch.com/docs/sphinx3.html#sphinx-3반응형'Search Engine' 카테고리의 다른 글
[MySQL] like, fulltext index, sphinx engine cost 비교 (0) 2024.08.21