편리

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

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

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건
+
제목 글쓴이 날짜 조회
12-08-29 조회 3,910
12-08-07 조회 3,583
12-08-03 조회 3,500
12-07-31 조회 3,617
12-07-30 조회 3,573
12-07-16 조회 3,783
12-07-15 조회 3,485
12-07-07 조회 3,481
12-07-06 조회 3,594
12-07-03 조회 3,632
12-06-29 조회 3,222
12-06-22 조회 3,585
12-06-17 조회 3,701
12-05-21 조회 3,773
12-05-02 조회 3,357
12-05-02 조회 4,147
12-05-02 조회 3,260
12-04-30 조회 3,415
12-04-30 조회 3,124
12-03-17 조회 3,946
12-03-10 조회 3,337
12-03-08 조회 3,757
12-03-03 조회 3,514
12-02-27 조회 4,928
12-02-17 조회 4,279
12-02-16 조회 4,433
12-02-03 조회 3,259
12-01-31 조회 3,015
12-01-24 조회 3,075
12-01-17 조회 3,831
12-01-05 조회 3,386
11-12-30 조회 3,003
11-12-23 조회 4,614
11-12-08 조회 3,367
11-12-07 조회 4,351
11-11-27 조회 3,771
11-11-25 조회 4,102
11-11-23 조회 3,492
11-11-22 조회 3,445
11-11-09 조회 3,177
11-10-23 조회 3,078
11-10-19 조회 3,055
11-10-08 조회 2,761
11-10-04 조회 2,773
11-10-04 조회 5,216
11-09-01 조회 4,274
11-08-13 조회 2,450
11-08-06 조회 3,140
11-07-11 조회 3,536
11-06-27 조회 2,906
11-06-21 조회 2,547
11-06-13 조회 2,355
11-06-07 조회 2,368
11-05-26 조회 2,363
11-04-20 조회 2,677
11-03-21 조회 2,766
11-03-18 조회 2,462
11-03-11 조회 2,502
11-02-07 조회 2,321
11-01-18 조회 2,638
11-01-12 조회 2,362
11-01-06 조회 2,481
10-12-10 조회 2,742
10-12-09 조회 2,407
10-12-08 조회 4,992
10-11-29 조회 2,529
10-11-28 조회 2,737
10-11-28 조회 2,588
10-11-19 조회 2,772
10-11-04 조회 2,677
10-10-21 조회 2,387
10-10-19 조회 3,337
10-10-12 조회 2,660
10-10-07 조회 2,478
10-09-30 조회 3,445
10-09-17 조회 3,842
10-09-17 조회 3,808
10-05-31 조회 3,472
09-12-31 조회 3,622
09-07-23 조회 4,926
08-09-16 조회 3,172
08-09-06 조회 2,890
08-09-04 조회 3,325
08-08-16 조회 4,378
08-08-15 조회 3,250
08-08-14 조회 4,462
08-08-12 조회 3,823
08-07-23 조회 2,746
08-07-10 조회 3,688
08-07-04 조회 2,913
08-06-27 조회 7,567
08-06-19 조회 4,853
08-05-27 조회 5,467
08-05-25 조회 5,295
08-05-23 조회 3,367
08-05-23 조회 4,506
08-05-21 조회 4,889
08-05-20 조회 4,013
08-05-20 조회 3,249
08-04-18 조회 4,281