Sphinx 검색엔진 라이브러리

Dana's Log·2022년 12월 23일
0

https://happydhkim.tistory.com/3
https://kimtaekju-study.tistory.com/101

소개

Database 기반의 사이트를 설계하다보면, 키워드 검색 기능이 필요할 때가 있습니다. 사실 대부분 사이트가 이런 검색기능이 있습니다. 일반적으로 SQL 에서 검색이라고 하면 LIKE 를 많이 떠올립니다. 데이터의 양이 많치 않을 경우에는 LIKE 로 충분합니다만, 수백만건 이상 되는 데이터에 대해서 검색하려면, LIKE 에는 많은 무리가 있습니다. 기본적으로 FullTable Scan 을 하게 될테니까요.

이런 검색을 위해서 Database 마다 Full Text Search 를 고유한 방식으로 지원하고 있습니다. MySQL 에서도 FullText Search 를 지원하지요. 하지만 아무래도 서버의 로드가 올라가거나 하는 문제들이 발생합니다. 이를 해결하기 위해서 대부분 Sphinx 라는 이 녀석을 사용하길 추천하더군요. :)

오늘은 이 Sphinx 검색 엔진에 대해서 알아보도록 하겠습니다.

http://sphinxsearch.com/

미리 알아야 할 점

이 스핑크스(Sphinx)라는 엔진은 MySQL 처럼 Index 를 위한 일종의 DB 입니다. 무슨 말인가면 Index 를 구성하는 방식이 크게 두가지로 나뉩니다. 첫번째는 자체적으로 MySQL 처럼 Database 가 되는 것이고, 또 한가지는 다른 Database 에서 값을 가져와서 Index 를 구성하는 방식입니다. 전자를 Real Time Index (RT index)라고 하고, 후자는 뭐라고 불러야 하는지 잘 모르겠네요. 후자도 두가지로 나뉩니다. full 로 가져오는 것과 변경된 내용만 따로 가져와서 merge 하는 방식입니다.

말씀드리고 싶은 점은, 대게 데이터베이스가 따로 있는 상태에서(예. MySQL) 검색이 필요한 부분만 Sphinx 에서 처리하는 경우가 많을거라 생각됩니다. 이때는 당연히 Real Time Index 를 사용하지 않을것 같습니다. 꼭 쓰겠다면 MySQL 같은 original 서버에 데이터를 CUD(Create, Update, Delete) 할때, Sphinx 에서도 같이 CUD 해 주면 되겠습니다. 아무튼 이렇게 할것이 아니라면, 주기적으로 Sphinx 에 데이터를 업데이트 해 주어야 합니다. -_-;;

후에 설명하겠지만, indexer 라는 녀석을 통해서 Sphinx 에 update 해주어야 합니다. 이게 아시겠지만 많은 부하가 걸리므로, main indexer 를 초기에 빌드하고, 이후 변경된 내용만 merge 할 수 있습니다. 이 부분은 직접 찾아보시기 바랍니다. 인터넷에 자료가 많이 있습니다.(사실 간단합니다.)

모쪼록 주기적으로 update(싱크를 맞추기 위해)하려면, indexer 를 호출해 주어야 합니다. 주기적으로요... Sphinx 에서 자동으로 싱크를 맞추지는 않습니다. 수동입니다. 그러므로 Crontab 같은 것을 이용하여, 일정시간마다 실행시켜 주어야 합니다. 이후 자세히 설명하도록 하겠습니다.

특징

1) GROUP BY, LIMIT, ORDER BY 쿼리에 대해 최적화 되어 있다는 점

2) RAM 사용량을 엄격하게 제한해준다는 점

3) 결과 셋을 병렬로 처리해준다는 점

4) 분산처리가 가능하며, 병렬 처리 시 뮤텍스 등의 동기화가 따로 필요 없다는 점

5) C++로 구현되어 인덱싱 및 검색 속도가 빠르다는 점

6) 인덱싱할 경우 텍스트 데이터의 경우 Disk에 저장하지 않기 때문에 실제 데이터는 DB(또는 기타 등등)에서 땡겨온다는 점

7) RT Indexer 지원( 1.0.x 이상 버전 부터 지원 함 )

[출처] 스핑크스(sphinx) 검색 엔진 소개|작성자 권상택

profile
다나로그

0개의 댓글