PHP4

全文検索namazuのphp用モジュール namazu.so を使用したサンプルソースです

ちょっとソースは汚いですがご勘弁を

サンプルソース

長々と・・・。

<?php
/*
 * namazu + php
 *
 *  ドキュメント全てに対して検索します。
 *  全てのインデックスを /usr/local/var/namazu/index 以下に作成しています。
 *
 *      mknmz -f /usr/local/etc/namazu/mknmzrc  /usr/local/www/data \
 *            -O /usr/local/var/namazu/index
 *
 *  更に、FreeBSDハンドブックのインデックス (/usr/local/var/namazu/index-handbook)
 *  を加えて検索します。
 *
 *  更に更に、php-ja(japanese/php-doc)のインデックス (/usr/local/var/namazu/index-php-ja)
 *  を加えて検索します。
 *
 *
 * (注) インデックスの追加方法
 *
 *  $nmz_indexHash[] , $baseDirHash[] , $baseUrlHash[] に同時に追加する事。
 *
 *
*/
header("Content-Type:text/html;charset=EUC-JP");
//定数定義
$THISPAGETITLE = "サイト内全文検索";

$lineParPage = 10;                  /* 1ページ当たりの表示行数 */

$formmethod = 'post';               /* method=post              */
$formaction = $_SERVER['PHP_SELF']; /* action                   */

$urlFilter = '';    /* URL フィルタ         */


//検索対象インデックスを追加する場合は、以下の3つの変数に
//追加する事。
// $nmz_indexHash[]  : namazuインデックスの位置
// $baseDirHash[]    : 文書の位置(ディレクトリ)
// $baseUrlHash[]    : URL置換文字列

//namazuインデックスのHash
$nmz_indexHash = array( "/usr/local/var/namazu/index"               /* Apache DocumentRoot      */
                       ,"/usr/local/var/namazu/index-handbook"      /* FreeBSDハンドブック      */
                       ,"/usr/local/var/namazu/index-php-ja"        /* portsのphp-doc(Japanese) */
                );
//ベースディレクトリのHash
$baseDirHash = array( "/usr/local/www/data/"                        /* Apache DocumentRoot      */
                     ,"/usr/share/doc/ja_JP.eucJP/books/handbook/"  /* FreeBSDハンドブック      */
                     ,"/usr/local/share/doc/php-ja/"                /* portsのphp-doc(Japanese) */
                );
//URL置換文字列のHash
$baseUrlHash = array( "http://www.ima.local/"                       /* Apache DocumentRoot      */
                     ,"http://www.ima.local/docs/handbook/"         /* FreeBSDハンドブック      */
                     ,"http://www.ima.local/docs/php-ja/"           /* portsのphp-doc(Japanese) */
                );

//変数定義
$query = '';                                        /* 検索式                   */
$whence = 0;                                        /* 表示ページ               */

$idxfiles = '';
$idxkeys = '';
$idxdate = '';


?>


<?php
    // php用namazuモジュールのロード
    if(!extension_loaded('namazu')){
        if(!dl('namazu.so')){
            echo 'namazu.so load error!!';
            exit;
        }
    }
?>

<?php
    //初期化
    $iHitNum = 0;       //検索結果数

    /* Treat HTTP input vars */
    if ( ! empty($_POST['query'])) {
        $query = $_POST['query'];
    } else if ( ! empty($_GET['query'])) {
        $query = $_GET['query'];
    }
    if ( ! empty($_POST['whence'])) {
        $whence = $_POST['whence'];
    } else if ( ! empty($_GET['whence'])) {
        $whence = $_GET['whence'];
    }

    if ( ! empty($_POST['doSearch'])){
        $whence = 0;
    }

    //検索指定なしの場合は表示ページをリセット
    if($query==''){
        $whence=0;      //表示ページ
    }
?>

<?php
    //インデックスの生成状況等の情報を取得する
    foreach($nmz_indexHash as $val){
        $str = $val . '/NMZ.status';
        $fd = fopen($str, 'r');
        if ($fd) {
            $idxfiles += trim(strchr(fgets($fd, 200), ' '));
            $idxkeys += trim(strchr(fgets($fd, 200), ' '));
            fclose($fd);
            $tsNew = filemtime($str);
            if(!$ts){ $ts = $tsNew;}
            if($tsNew){
                if($tsNew > $ts){ $ts = $tsNew;}
            }
            if ($ts) {
                $idxdate = date('Y/m/d H:m:d', $ts);
                $latestIndexName = $val;
            }
        }
    }

?>



<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=EUC-JP'>
<title>全文検索</title>
<meta http-equiv="Content-Style-Type" content="text/css">
<link rel="stylesheet" href="/ss.css">
<style type="text/css">
<!--
a:active {  font-size: 10pt; line-height: 13pt; color: #CC6600;}
a:hover {  font-size: 10pt; line-height: 13pt; color: #666666; background-color: #FFCC33;}
a:link {  font-size: 10pt; line-height: 13pt; color: #CC6600;}
a:visited {  font-size: 10pt; line-height: 13pt; color: #CC6600;}
-->
</style>
<!-- <base target="main"> -->
</head>
<body>
<div>
<h1><?php echo $THISPAGETITLE; ?></h1>
</div>
<a href="./index.html">トップに戻る</a>
<hr>
<p>
現在、<font color="red"><?php echo $idxfiles; ?></font> のファイルがインデックス化され、
 <font color="red"><?php echo $idxkeys; ?> </font>個のキーワードが登録されています。
</p>
<p>
インデックスの最終更新日: <b><?php echo $idxdate; ?></b> (<?php echo $latestIndexName; ?>)
<br>
検索対象インデックス (<?php echo count($nmz_indexHash); ?>)
<br>
<?php
foreach($nmz_indexHash as $val){
    echo "  ・" . $val . "<br>";
}
?>
</p>
<form method="<?php echo $formmethod; ?>" action="<?php echo $formaction; ?>">
<p>
<strong>検索式:</strong> 
<input type="text" name="query" size="50" value="<?php echo $query; ?>">
<input type="submit" name="doSearch" value="検 索">
</p>
</form>
<hr>

<?php

    if($query==''){
    }else{
        $sRealQuery = $query;

        //URLでフィルタする。
        $sRealQuery = $sRealQuery .$urlFilter;

        //ソート
        nmz_set_sortmethod('score');
        nmz_set_sortorder('descending');
        //nmz_set_sortmethod('date');
        //nmz_set_sortorder('descending');
        $nmz=nmz_open($nmz_indexHash);
        $result=nmz_search($nmz,$sRealQuery);
        $iHitNum=nmz_num_hits($result);
?>

<font size="-1"><b>検索式にマッチする <?php echo $iHitNum; ?> 個の文書が見つかりました。</b></font>
<dl>
<?php
        //開始位置
        $sBrBr = "";
        $i = $whence * $lineParPage;
        for(;$i < $iHitNum && $i < (($whence+1)*$lineParPage);$i++){
            $count=$i+1;
            //絶対ファイル名をURLに置換する。
            $sUrl = nmz_result_field($result,$i,"uri");
            //$baseDirHash[]の配列の数だけ繰り返す
            foreach($baseDirHash as $key => $val){
                $sUrl=ereg_replace("^" . $val, $baseUrlHash[$key], $sUrl);
            }
            // namazu検索結果取得
            $sSubject  = nmz_result_field($result,$i,"subject");
            $sSummary  = nmz_result_field($result,$i,"summary");
            $sFileSize = nmz_result_field($result,$i,"size");
            $sScore    = nmz_result_score($result,$i);
            //タイトル・日付・本文の初期値
            $sTitle = $sSubject;
            $sDate = nmz_result_field($result,$i,"date");
            $sContent = $sSummary;
            //タイトル・日付・本文に分割
            //$pattern = "/(\s\[|\]\s)/";                   // " [" と "] " で分割
            //$pattern = "/(\[|\])/";                           // "[" と "]" で分割(空白がないページがあった為)
            //$sArray = preg_split($pattern,$sSummary); // 正規表現で分割し配列へ
            //$iArrayNum = count($sArray);
            //タイトル・日付・本文を変数に設定
            //if ($iArrayNum == 3){
            //  $sTitle = $sArray[0];
            //  $sDate = $sArray[1];
            //  $sContent = $sArray[2];
            //}

            if ($sTitle=="") $sTitle="(無題)";

            //ファイルの情報取得
            $sFileDate=nmz_result_field($result,$i,"date");
            $sFileSize=nmz_result_field($result,$i,"size");

            //HTMLタグの除去
            //$sTitle = strip_tags($sTitle);
            //$sDate = strip_tags($sDate);
            //$sContent = strip_tags($sContent);
            //HTML特殊文字のエンコード
            $sTitle = htmlspecialchars($sTitle);
            $sDate = htmlspecialchars($sDate);
            $sContent = htmlspecialchars($sContent);

            $arrayPathInfo=pathinfo(nmz_result_field($result,$i,"uri"));
            $sBaseName=$arrayPathInfo['basename'];
            $sExtension=$arrayPathInfo['extension'];
            if (strlen($sExtension)>0){
                $sFileNameBody=substr($sBaseName,0,strlen($sBaseName)-(strlen($sExtension)+1));
            }else{
                $sFileNameBody=$sBaseName;
            }

print <<<EOS
    $sBrBr
    <dt>$count. <a href="$sUrl">$sTitle</a> <font size="2"><font>(Score:$sScore)</font>   ($sFileSize bytes)
    <dd><strong>Date:</strong><em>$sDate</em>
    <dd>$sContent
EOS;
            $sBrBr="<br><br>";
        }
        nmz_free_result($result);
        nmz_close($nmz);
    }
?>
</dl>
<br>
<table width="90%" border="0" cellspacing="0" cellpadding="0" align="center">
<?php
$sPrevCaption="";
$sPrevUrl=$formaction;
if ($whence>0){
    $sPrevCaption="[前のページへ]";
    $sPrevUrl = $sPrevUrl ."?query=".rawurlencode($query);
    $sPrevUrl = $sPrevUrl ."&whence=".($whence-1);
}
$sNextCaption="";
$sNextUrl=$formaction;
if (($iHitNum/$lineParPage) > ($whence+1)){
    $sNextCaption="[次のページへ]";
    $sNextUrl = $sNextUrl ."?query=".rawurlencode($query);
    $sNextUrl = $sNextUrl ."&whence=".($whence+1);
}
?>
    <tr valign="middle"> 
        <td align="left"  width="50%"><font size="+1"><a href="<?php echo $sPrevUrl; ?>"><b><?php echo $sPrevCaption; ?></b></a></font></td>
        <td align="right" width="50%"><font size="+1"><a href="<?php echo $sNextUrl; ?>"><b><?php echo $sNextCaption; ?></b></a></font></td>
    </tr>
</table>
</body>
</html>

関連ページ