ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Search Engine] Sphinx
    Search Engine 2024. 8. 22. 20:02
    반응형
    해당 포스팅에서는 Sphinx 검색엔진을 설치하고, 쿼리를 실행 해보겠습니다.

     


    Sphinx란?

    고성능, 오픈 소스 검색 엔진으로, 대량의 데이터를 신속하고 정확하게 검색할 수 있도록 설계된 시스템입니다. 특히 MySQL, PostgreSQL 같은 관계형 데이터베이스와의 통합이 뛰어나며, 다양한 애플리케이션에서 쉽게 사용할 수 있습니다.

     

    Sphinx의 특징

    1. 빠른 검색 속도: Sphinx는 대용량 데이터에서도 매우 빠른 검색 성능을 자랑합니다. 이는 Sphinx가 데이터의 색인(Index)을 생성하고, 검색할 때 이 색인을 활용하여 속도를 극대화하기 때문입니다.
    2. 확장성: Sphinx는 수백만 개의 문서를 색인하고 검색할 수 있는 능력을 가지고 있어, 대규모 애플리케이션에서도 사용하기 적합합니다. 또한, 분산 검색을 지원하여 여러 서버에 걸쳐 작업을 분산시킬 수 있습니다.
    3. 유연한 통합: Sphinx는 MySQL, PostgreSQL 등의 데이터베이스와 쉽게 통합할 수 있습니다. 또한, SphinxQL이라는 자체 쿼리 언어를 제공하여 SQL과 유사한 방식으로 검색 쿼리를 작성할 수 있어, 기존의 데이터베이스 시스템과 자연스럽게 연결됩니다.
    4. 다양한 언어 지원: Sphinx는 다국어 검색을 지원하며, 한국어를 비롯한 여러 언어의 형태소 분석도 가능합니다. 이를 통해 여러 언어로 작성된 문서도 정확하게 검색할 수 있습니다.
    5. 실시간 색인 지원: Sphinx는 실시간 색인(Real-Time Indexing)을 지원하여, 데이터가 추가되거나 수정될 때 즉시 검색 가능하도록 반영할 수 있습니다. 이는 데이터가 자주 변경되는 애플리케이션에서 특히 유용합니다.
    6. 다양한 필터링과 정렬 기능: 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

    댓글

Designed by Tistory.