스핑크스 검색엔진 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 |