SphinxSearch (스핑크스) 설치 및 쿼리 테스트 + PHP 에서 사용-2 > 그누보드5 팁자료실

그누보드5 팁자료실

SphinxSearch (스핑크스) 설치 및 쿼리 테스트 + PHP 에서 사용-2 정보

SphinxSearch (스핑크스) 설치 및 쿼리 테스트 + PHP 에서 사용-2

본문

이전 포스트  에서 sphinxsearch 설치와 설정을 하였습니다.

이제 PHP 에서 이를 이용하여 검색결과를 처리하는 방법을 알아보겠습니다. 이전 포스팅에서도 얘기드렸지만, 스핑크스는 mysql 프로토콜을 그대로 따라서 만들었기 때문에 php에서 mysql 쓰듯이 사용하면 됩니다. mysqli 로도 가능하고, PDO로 접속해도 됩니다. (이 글에서는 그냥 mysql 함수를 사용할것입니다.)

 

테이블은 g5_write_test 테이블입니다. 약 30만개의 영화정보 데이타를 미리 입력해두었습니다.(국내 데이타를 구하기 어려워서 영문으로 된 5천개짜리 데이타를 반복하여 입력했습니다.)

 

먼저 PHP(그누보드5) 에서 제목과 본문을 기준으로 검색합니다. 테스트 코드입니다.


<?php
    include "./_common.php";
    $list = array();
    try {
        $row =  sql_fetch("select /* sql_no_cache */ count(*) cnt from g5_write_test");
        $total_index = $row['cnt'];
        $start_time = microtime(true);
        $search_str = "Hero";
        $sql = "select /* sql_no_cache */  wr_id, wr_subject from g5_write_test where wr_subject like '%{$search_str}%' or  wr_content like '%{$search_str}%' limit 30')";
        $result = sql_query($sql);
        while($row = sql_fetch_array($result)) {
            $list[] = $row;
        }
        $row = sql_fetch("select /* sql_no_cache */  count(*) cnt from g5_write_test where wr_subject like '%{$search_str}%' or  wr_content like '%{$search_str}%'");
        $total_count = $row['cnt'];
        $end_time =  microtime(true);
        $exec_time =   round(($end_time - $start_time)*1000000)/1000;
        echo "그누보드5 검색결과 <br>";
        echo "전체 색인 문서수 : $total_index <br>";
        echo "검색어 : $search_str <br>";
        echo "검색결과수 : $total_count <br>";
        echo "검색 수행시간 : ".sprintf("%.3f", $exec_time / 1000)."s"."<br>";
    } catch(Exception $e) {
        $e->getMessage();
    }
?>

 

두번째 sphinxsearch 를 이용한 검색 테스트입니다.


<?php
    $sphinx_ip = "127.0.0.1";
    $sphinx_port = 9306;
    $sphinx_db = "board";
    $list = array();
    try {
        $sph_conn = mysql_connect($sphinx_ip.":".$sphinx_port, "","");
        mysql_select_db($sphinx_db, $sph_conn);
        $result = mysql_query("select count(*) cnt from board");
        $row = mysql_fetch_assoc($result);
        $total_index = $row['cnt'];
        $start_time = microtime(true);
        $search_str = "Hero";
        $sql = "select wr_id, wr_subject from board where match('@(wr_subject,wr_content) \"*".$search_str."*\" ')";
        
        $result = mysql_query($sql);
        while($row = mysql_fetch_assoc($result)) {
            $list[] = $row;
        }
        $result = mysql_query("SHOW META LIKE 'total_found'");
        $row = mysql_fetch_assoc($result);
        $total_count = $row['Value'];
        $end_time =  microtime(true);
        $exec_time =   round(($end_time - $start_time)*1000000)/1000;
        echo "스핑크스 검색결과 <br>";
        echo "전체 색인 문서수 : $total_index <br>";
        echo "검색어 : $search_str <br>";
        echo "검색결과수 : $total_count <br>";
        echo "검색 수행시간 : ".sprintf("%.3f", $exec_time / 1000)."s"."<br>";
    } catch(Exception $e) {
        $e->getMessage();
    }
?>

 

테스트 결과입니다. 개발용 서버임으로 외부에서 요청이 없는 상태라서, 임의로 request를 발생시킨 상태에서  페이지를 호출하였습니다. 페이지요청 때문에 검색결과수는 조금 다를수 있습니다.

 


PHP 그누보드 검색결과
전체 색인 문서수 : 292689
검색어 : Hero
검색결과수 : 9326
검색 수행시간 : 1.182s

 


스핑크스 검색결과
전체 색인 문서수 : 292689
검색어 : Hero
검색결과수 : 9326
검색 수행시간 : 0.004s

 

접속자가 맣고, 검색작업이 많은 사이트에서는 더 큰 차이가 발생합니다. 

 

결론

sphinxsearch(스핑크스)를 사용하면, 사이트 내부검색으로 인하여 사이트가 느려지는 문제는 해결할수 있습니다. 물론 스핑크스를 도입했을때, 단점이 없는것은 아닙니다. 병합색인을 위한 추가 설정이 필요하고, 이에 따른 코드 수정도 필요합니다. 병합을 위하여 일정시간(대략 3-5분) 에 한번씩 병합색인을 위한 indexer 를 실행하여야 하고, 마지막 병합색인이 처리된 시간사이에 등록된 글이나 수정된 글은 검색이 안되는 문제가 있습니다. 사이트 성격에 따라 다르겠지만, 검색 결과는 몇분정도의 시간차는 발생해도 운영에 지장이 없습니다. 이런 문제보다 스핑크스를 씀으로써 얻는 이득이 크기 때문에 서비스에 이를 도입한다면 만족할거라 생각합니다. 

 

추천
3

댓글 0개

전체 30 |RSS
그누보드5 팁자료실 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT