본문 바로가기

서버/Linux

sphinx 0.9.9 한글화 (스핑크스 검색엔진 euc-kr에서 한글화)


스핑크스 검색엔진 euc-kr 환경에서 한글화

절절한 부분에 iconv()를 사용하면 됩니다.

 

// 리눅스 명령어

// 설치방법은 찾아보면 많이 나오고, 영문이긴하지만 다운받으면 readme.txt 파일등에 잘 되어있습니다.

sphinx start : searchd
sphinx stop  : searchd --stop

 

// 인덱스 다시생성(실시간 생성도 좋지만 여기서는 스케줄에 의한 풀생성을 했다) 둘중에 하나만 하면됨
sphinx index rebuild :  indexer --rotate [인덱스명]
   indexer --config ./sphinx.conf [인덱스명]
   ex) indexer --rotate dietgirl
   ex) indexer --config ./sphinx.conf dietgirl

 

// 설정파일 sphinx.conf
// 기본설정을 추가하고 변경하고싶은 부분만 정의하여 추가한다.
인덱스 추가 =====================================================================

## dietWorld data source definition
source dietGirl : 기본설정_source
{
        sql_query = SELECT seq AS id, gid AS group_id, UNIX_TIMESTAMP(reg_date) AS date_added, \
                        subject, contents \
                        FROM dietGirl WHERE used=1
        sql_ranged_throttle = 100
        sql_query_info = SELECT * FROM dietGirl WHERE seq=$id
}

## dietboard index definition
index 땡떙땡1_index : 기본설정_index
{
        source = dietGirl
        path = /usr/local/sphinx_0.9.9/var/data/dietGirl_index
}

===================================================================================

 

// php파일
// 모든소스를 넣을수는 없고 부분적으로만 넣었습니다.
// 절절한 부분에 iconv()를 사용하면 됩니다.

// 우선 search_conf.php를 만들어 기본적인 설정 및 include 파일을 포함시킨다.
===================================================================================

<?php
include_once $_SERVER['DOCUMENT_ROOT']."/sphinx_0.9.9/lib/sphinxapi.php";

$cl = new SphinxClient();
$cl->SetConnectTimeout(1);
$cl->SetArrayResult(true);

 

/*** SetMatchMode(?)
SPH_MATCH_ALL 매치 모든 검색어 (기본 모드).
SPH_MATCH_ANY 경기 쿼리 단어 중 하나.
SPH_MATCH_PHRASE 완벽한 일치를 필요로하는 문구
SPH_MATCH_BOOLEAN 부울 표현식으로 쿼리. // 부울쿼리 &|- 연산자 사용
SPH_MATCH_EXTENDED 스핑크스 내부 쿼리 언어로 표현대로 쿼리.
SPH_MATCH_FULLSCAN fullscan을 활성화합니다.
SPH_MATCH_EXTENDED2 SPH_MATCH_EXTENDED 플러스 순위 및 쿼럼 같은 지원을 검색할 수 있습니다. 확장검색모드
 * ***/


$cl->SetMatchMode(SPH_MATCH_BOOLEAN);
$cl->SetRankingMode(SPH_RANK_NONE); // 순위

$cl->setMaxQueryTime(3000); // 3초
$cl->setLimits(0,5); // 페이징 처리 (처음 5개씩만 출력)

$opts = array
(
 "before_match"  => "<span style='background-color:yellow'>",
 "after_match"  => "</span>",
 "chunk_separator" => iconv('euc-kr','utf-8',"···"),
 "limit"    => 128,
 "around"   => 5,
 "exact_phrase"  => true, // 정확한 구문 표시
);
  
// 검색 인덱스, 테이블정의 (스핑크스 인덱스명,쿼리문)
// 개발자는 아래와 같이 검색할 테이블(인덱스)를 정의하여 정의된 내용만 검색되게끔 처리하였음
// 검색할 테이블이 많아지면 이것이 관리에 아주 편함
$qIndex_tables = array(
 array(
  "땡떙땡1_index",

  "select '땡떙땡1_index' as sphinx_index, '땡떙땡1' as division,seq,subject,contents,reg_date from 땡땡땡1_table where"
 ),
 array(
  "땡땡땡2_index",

  "select '땡땡땡2_index' as sphinx_index, '땡땡땡2' as division,seq,subject,contents,reg_date from 땡땡땡2_table where"
 ),
);
?>
===================================================================================

 

//search.php 파일 ( 검색시 질의할 페이지 )
===================================================================================
<?php
include_once $_SERVER['DOCUMENT_ROOT']."/search_conf.php"; // 위에 conf파일임

$sphinx_qString = $_POST['qString'] ? $_POST['qString'] : $_GET['qString']; // 질의문
if( $sphinx_qString == "" ) $sphinx_qString = $tmp_qString;

if(isset($sphinx_qString)) {
    $sphinx_qString = trim($sphinx_qString);
    if($sphinx_qString != ''){
  $qIndex = $qIndex_tables; // 검색 색인 지정
  $sphinx_qString = iconv('euc-kr','utf-8',$sphinx_qString);
  // 스핑크스 질의
  for( $i=0; $i < sizeOf($qIndex); $i++ ){
   $cl->AddQuery ( $sphinx_qString, $qIndex[$i][0] );
  }

  if(false !== ($res = $cl->RunQueries())) {
   $sql = "";
   for( $i=0; $i < sizeOf($res); $i++ ){
    $seqs = array();
    if( sizeof($res[$i]['matches']) > 0 ){
     foreach($res[$i]['matches'] as $row) {
      $seqs[] = $row['id'];
     }
    }
    if(count($seqs) != 0) {
     $wheres = 'seq IN ('.implode(',', $seqs).')';
     if( $qIndex[$i][1] != "" ){
      if( $sql != "" ) $sql .= " union ";
      $sql .= $qIndex[$i][1]." ".$wheres;
     }//if
    }//if
   }//for

   $result = $dbCon->query($sql);

   $i = 0;
   $j = 0;
   $division = "";
   while( $row = @mysql_fetch_assoc($result) ){ // mysql_fetch_array 보다 퍼포먼스가 더 좋을것임
    if( $division == "" ){
     $division = $row['sphinx_index'];
    }elseif( $division != $row['sphinx_index'] ){
     $division = $row['sphinx_index'];
     $j = 0;
     $i++;
    }
    $loop_sphinx[$i]['division'] = $division;
    $loop_sphinx[$i]['division_str'] = $row['division'];
    $loop_sphinx[$i]['val'][$j]['seq'] = $row['seq'];
    $tmp_qString = iconv("utf-8","euc-kr",$sphinx_qString);
    $loop_sphinx[$i]['val'][$j]['subject'] = str_replace($tmp_qString,$opts['before_match'].$tmp_qString.$opts['after_match'],$row['subject']);
    $loop_sphinx[$i]['val'][$j]['reg_date'] = $row['reg_date'];
    $tmp_contents = strip_tags($row['contents']);
    $tmp_contents = iconv('euc-kr','utf-8',$tmp_contents);
    $docs[$i][$j] = $tmp_contents;
    if( $division_arr[$i] == "" ) $division_arr[$i] = $division;
    $j++;
   }
   
   for( $i=0; $i < sizeOf($docs); $i++ ){
    $res = $cl->BuildExcerpts ( $docs[$i], $division_arr[$i], $sphinx_qString, $opts ); // 본문글에서 검색문자 주변글 줄이기
    if ( !$res ){
     die ( "ERROR: " . $cl->GetLastError() . ".\n" );
    }else{
     foreach ( $res as $key => $entry ){
      $tmp_entry = iconv('utf-8','euc-kr',$entry);
      $loop_sphinx[$i]['val'][$key][contents] = $tmp_entry;
     }//foreach
    }
   }//for
  }//if
 }//if
}//if
echo "<pre>"; print_r($loop_sphinx); echo "</pre>"; // 출력확인
?>
===================================================================================

'서버 > Linux' 카테고리의 다른 글

OpenX 2.8.5 한글화  (0) 2012.01.02
리눅스 관리 명령어 기초1  (0) 2011.12.28
CentOS 6.2 APM 구축 그리고 환경 설정  (0) 2011.12.28