편리

juso.sir.co.kr 도로명 주소 검색 시스템 구축 가이드 - 주소검색

· 2014-08-28 (목) 10:44:24 · 6442

sphinx에서는 searchd 를 이용한 검색 쿼리문과 php 등을 이용한 api 를 제공하고 있습니다.

sphinx 설치를 위해 소스 파일을 압축해제했던 /usr/local/src/sphinx-2.1.4-release/api 경로로

이동해보면 php 등의 api 사용 예제 파일이 존재합니다. juso.sir.co.kr 에서는 php api 를 이용했습니다.

 

아래는 juso.sir.co.kr 에서 사용자의 검색 요청을 받아 검색 요청을 하고 결과를 처리하는 파일의 코드입니다.

 

[code]

<?php

include_once('./_common.php');

 

if(!$q) {

    $juso['error'] = '검색어를 입력해 주십시오.';

 

    echo $_GET['callback'].'('.json_encode($juso).')';

    exit;

}

 

// spninx api load

require ( G5_LIB_PATH.'/sphinx/sphinxapi.php' );

 

$cl = new SphinxClient ();

 

$host = $config['cf_sphinx_host'];

$port = $config['cf_sphinx_port'];

$index = $config['cf_sphinx_index'];

$rows = $config['cf_page_rows'];

 

$cl->SetServer ( $host, $port );

$cl->SetConnectTimeout ( 1 );

$cl->SetArrayResult ( true );

$cl->SetWeights ( array ( 100, 1 ) );

$cl->SetMatchMode ( SPH_MATCH_EXTENDED );

//$cl->setSortMode( SPH_SORT_ATTR_ASC, 'sn' );

 

if ($page == '') $page = 1;

$offset = ($page - 1) * $rows;

$cl->SetLimits ( $offset, $rows, $config['cf_max_rows']);

 

$query = '';

 

if($sido)

    $query .= ' @sido "'.$sido.'" ';

 

if($gugun)

    $query .= ' @gugun "'.$gugun.'" ';

 

$sword = explode(' ', trim($q));

 

$field = '(doro,jibeon)';

 

foreach($sword as $val) {

    $word = trim($val);

    if(!$word)

        continue;

 

    $query .= ' @'.$field.' "'.$word.'*" ';

}

 

$res = $cl->Query ( $query, $index );

 

$error = '';

if ($res === false) {

    $error = '검색실패 : ' . $cl->GetLastError();

} else {

    $total_count = $res['total'];

    $total_page  = ceil($total_count / $rows);  // 전체 페이지 계산

 

    $count = count($res['matches']);

 

    if($_GET['link'] != 'false')

        $link = true;

    else

        $link = false;

 

    ob_start();

?>

 

<div class="result_msg">

    검색결과 <b><?php echo number_format($total_count); ?></b>

</div>

 

<?php

    for($i=0; $i<$count; $i++) {

        $data = $res['matches'][$i]['attrs'];

 

        $eupmyeon = false;

        $zipcode = preg_replace('/([0-9]{3})([0-9]{3})/', '\\1-\\2', $data['zipcode']);

        $zip = explode('-', $zipcode);

        $zip1 = $zip[0];

        $zip2 = $zip[1];

        $addr1 = $data['sido'].' '.$data['gugun'];

        if($data['beopname'] && preg_match('/(읍|면)$/', $data['beopname'])) {

            $addr1 .= ' '.$data['beopname'];

            $eupmyeon = true;

        }

        $addr1 .= ' '.$data['doroname'];

        if($data['jiha'])

            $jiha = ' 지하';

        else

            $jiha = ' ';

        $addr1 .= $jiha.$data['geonbon'];

        if($data['geonbu'])

            $addr1 .= '-'.$data['geonbu'];

 

        $addr3 = '';

        if($data['beopname'] && !$eupmyeon)

            $addr3 = ' ('.$data['beopname'];

        if($data['geonname'] || $data['geonsangse']) {

            if($addr3)

                $addr3 .= ', ';

            else

                $addr3 = ' (';

        }

        if($data['geonname']) {

            $addr3 .= $data['geonname'];

        } else {

            if($data['geonsangse'])

                $addr3 .= $data['geonsangse'];

            else {

                if($data['daryang'] && !$data['geonname2']) {

                    if($addr3)

                        $addr3 .= ', '.$data['daryang'];

                    else

                        $addr3 .= ' ('.$data['daryang'];

                } else if(!$data['daryang'] && $data['geonname2']) {

                    if($addr3)

                        $addr3 .= ', '.$data['geonname2'];

                    else

                        $addr3 .= ' ('.$data['geonname2'];

                }

            }

        }

        if($addr3)

            $addr3 .= ')';

 

        $addr_ji = $data['sido'].' '.$data['gugun'];

        if($data['beopname'])

            $addr_ji .= ' '.$data['beopname'];

        if($data['ri'])

            $addr_ji .= ' '.$data['ri'];

        if($data['san'])

            $san = ' 산';

        else

            $san = ' ';

        $addr_ji .= $san.$data['jibon'];

        if($data['jibu'])

            $addr_ji .= '-'.$data['jibu'];

 

        if($data['geonname']) {

            $addr_ji .= ' '.$data['geonname'];

        } else {

            if($data['geonsangse'])

                $addr_ji .= ' '.$data['geonsangse'];

        }

 

        $addr3 = htmlentities($addr3, ENT_QUOTES, "UTF-8");

        $addr_ji = htmlentities($addr_ji, ENT_QUOTES, "UTF-8");

 

        if($i == 0)

            echo '<ul>'.PHP_EOL;

        echo '<li>'.PHP_EOL;

        echo '<span></span>';

        if($link)

            echo "<a href='#' onclick='put_data(\"".$zip1."\", \"".$zip2."\", \"".trim($addr1)."\", \"".trim($addr3)."\", \"".trim($addr_ji)."\"); return false;'>";

        echo '<strong>'.$zipcode.'</strong>';

        echo ' '.$addr1;

        echo $addr3;

        if($link)

            echo '</a>';

        echo '<div>(지번주소) '.$addr_ji.'</div>';

        echo '</li>'.PHP_EOL;

    }

 

    if($i > 0)

        echo '</ul>';

    else

        echo '<div class="result_msg result_fail">검색결과가 없습니다.</div>';

 

    //echo '<p>실행시간 : '.$res['time'].'</p>';

 

    $pagelist = get_paging($is_mobile ? $config['cf_mobile_list_pages'] : $config['cf_list_pages'], $page, $total_page);

    echo $pagelist;

 

    $contents = ob_get_contents();

    ob_end_clean();

}

 

$jusu = array();

$juso['error'] = $error;

$juso['juso'] = $contents;

 

echo $_GET['callback'].'('.json_encode($juso).')';

?> 

[/code]

 

sphinx의 api 관련 자료는 http://sphinxsearch.com/docs/archives/2.1.4/api-reference.html 를 참고하시면 됩니다.

그외 검색관련 query 는 http://sphinxsearch.com/docs/archives/2.1.4/searching.html 를 참고하시면 됩니다.

|
댓글을 작성하시려면 로그인이 필요합니다.

프로그램

8,188건
+
제목 글쓴이 날짜 조회
14-09-19 조회 3,541
14-09-19 조회 3,750
14-09-19 조회 3,991
14-09-19 조회 3,780
14-09-19 조회 4,042
14-09-19 조회 3,712
14-09-19 조회 3,751
14-09-19 조회 3,969
14-09-19 조회 3,713
14-09-19 조회 3,704
14-09-19 조회 3,788
14-09-19 조회 4,652
14-09-19 조회 3,749
14-09-18 조회 3,745
14-09-18 조회 3,604
14-09-18 조회 3,989
14-09-18 조회 3,751
14-09-18 조회 3,541
14-09-18 조회 3,935
14-09-18 조회 4,288
14-09-18 조회 3,956
14-09-18 조회 3,887
14-09-18 조회 3,988
14-09-18 조회 4,745
14-09-18 조회 3,913
14-09-18 조회 3,901
14-09-18 조회 5,297
14-09-18 조회 5,217
14-09-18 조회 4,013
14-09-18 조회 4,504
14-09-18 조회 4,051
14-09-18 조회 3,927
14-09-18 조회 4,158
14-09-18 조회 4,743
14-09-17 조회 3,748
14-09-16 조회 4,719
14-09-16 조회 4,919
14-09-16 조회 3,655
14-09-15 조회 3,832
14-09-15 조회 3,436
14-09-13 조회 4,485
14-09-12 조회 4,330
14-09-12 조회 3,725
14-09-12 조회 3,621
14-09-11 조회 3,335
14-09-11 조회 4,117
14-09-11 조회 4,388
14-09-10 조회 3,253
14-09-10 조회 3,437
14-09-03 조회 3,670
14-09-03 조회 3,610
14-09-03 조회 3,845
14-09-03 조회 5,480
14-09-01 조회 5,261
14-09-01 조회 4,577
14-09-01 조회 4,151
14-08-30 조회 4,172
14-08-30 조회 5,248
14-08-29 조회 4,375
14-08-28 조회 5,788
14-08-28 조회 6,443
14-08-28 조회 6,611
14-08-27 조회 6,726
14-08-27 조회 6,826
14-08-27 조회 5,370
14-08-27 조회 2만
14-08-27 조회 4,091
14-08-26 조회 4,088
14-08-26 조회 4,000
14-08-26 조회 3,822
14-08-26 조회 3,872
14-08-26 조회 3,698
14-08-26 조회 3,535
14-08-26 조회 4,054
14-08-26 조회 3,833
14-08-26 조회 3,783
14-08-26 조회 3,852
14-08-26 조회 3,865
14-08-26 조회 3,649
14-08-26 조회 3,860
14-08-26 조회 3,936
14-08-26 조회 3,858
14-08-26 조회 3,889
14-08-26 조회 3,716
14-08-26 조회 3,698
14-08-26 조회 3,895
14-08-26 조회 3,574
14-08-26 조회 3,648
14-08-26 조회 3,476
14-08-26 조회 3,389
14-08-26 조회 3,543
14-08-26 조회 4,100
14-08-26 조회 3,478
14-08-26 조회 3,709
14-08-26 조회 3,636
14-08-26 조회 3,407
14-08-26 조회 3,514
14-08-26 조회 3,470
14-08-26 조회 3,604
14-08-26 조회 4,226