作成日:2003年02月07日、更新日:2006年02月11日 作成:鷹の巣

自宅サーバーに全文検索システムを導入した経過とNamazu for Win32を導入した時の覚書です。


全文検索システムNamazu(Windows用)の設定覚書

Windows 2000の自宅WWWサーバー(AN HTTPD)において、自サイト内の文書を検索可能にしました。検索システムには、応答が良好でインストールが極めて簡単な全文検索システム Namazu for Win32を導入しました。インストールは、参考になるページを見て、設定を行いました。有用なフリーソフトと設定Webページをご提供して頂き、ありがとうございました。このWebページでは、インストールや検証方法以外での追加事項を主に説明していますので、補足的に読んで下さい

目次

  1. はじめに
  2. 簡単に設置できる自サイト内の文書検索方法
  3. ロボット(クローラ)にWebデータを収集させる方法
  4. 全文検索システムの検討
  5. namazuのインストールでの追記事項(2006年02月11日 一部追記)
  6. namazuの基本設定(2004年06月15日 追記)
  7. インデックスの作成例
  8. 検索画面の変更例(2004年06月15日 追記)
  9. Webページへのnamazu検索窓の設置方法
  10. Namazuの更新(2004年06月15日 追記)
  11. おわりに(雑多なこと)

1. はじめに

私のサイトは、サイト開設当初、何も考えずに、ご訪問客帳(ゲストブック)自宅サーバー掲示板とを設置しました。そして、そのまま現在に至っております。しかし現在、前者の掲示板は、私個人との会話用であるのに対して、後者の掲示板が嬉しいことに、ご投稿数が1000を越えFAQ形式に近いものとなりました。これを何とか検索できるようにし、再利用を可能にするため、全文検索システムを導入しました。

以下は、私が行った全文検索システムの経過と、導入の検討に当たって読んだ参考URLと、導入後に行った内容について、説明しています。

2. 簡単に設置できる自サイト内の文書検索方法

この方法は、検索エンジンサイトに自サイト内の文書検索を行ってもらう方法です。貴方のサイトが自宅サーバーで、自分のドメイン名のURL(http://www.example.com/)やダイナミックDNSのサブドメイン名のURL(http://example.hn.org/)の様な形であれば、Googleのsite検索が使用出来ます。サイト単位ですから、サイト内のディレクトリや~(チルダ)を含んだユーザディレクトリは、対象外となります。詳細は、結城浩さんのサイト内の検索にGoogle.comを使う方法をご参照下さい。以下に設置した例を示しましたので、「当サイト内検索」ボタンを試しに押してみて下さい。1ヶ月以内の最新の内容の検索は、できませんが十分使用出来るはずです。

 Google Googlize!で簡単設置。

ただし、確実に自サイトのWebページをロボットに収集してもらわなければなりません。Web マスターのための Google情報などを1つの基準として、1ページあたりのリンク数は100未満のロボット(クローラ)用のリンクページを作成し、トップページから階層的にリンクさせる必要があります。尚、作成したリンクページは、Perlが使用出来る環境にあるのなら、検索エンジンへのURL自動登録用Perlスクリプト(IO::Socketモジュール使用)を起動して、一気に登録します。

3. ロボット(クローラ)にWebデータを収集させる方法

前項の方法では、Googleのロボット(クローラ)が、Webデータを収集することが前提になります。Google以外のロボット(クローラ)でも同じですが、今回、目的とする掲示板などのCGIが作成する動的なWebデータは、一般的には収集されません。

私の使用している掲示板は、KENT WEBさんのWeb ForumのCGIでURLは、
http://www.example.com/cgi/bbs/wforum.cgi?mode=allread&no=XXXX&page=0
というような形になっています。Windowsで言う拡張子が「.cgi」になっていたり、「?」の右に引数(ひきすう)注)1があると、クローラは、出口の見当たらないクローラトラップ(罠)に入らないようにこのURLを読まないようです。従って、クローラにCGIデータを収集してもらう様にするため、以下の何れかの対策を行う必要があります。

  1. CGIのデータをあらかじめ、HTMLファイルに変換し、静的なHTMLファイルにする。勿論、静的なクローラ用HTMLファイルより各HTMLファイルに対して、全てリンクを書く必要があります。注)2

  2. Webサーバーのデフォルトファイル名のindex.htmlにindex.cgiを加えて、CGIの出力するURLを
    http://www.example.com/cgi/bbs/XXXX/
    とするようにCGIを改造する。(動的にディレクトリURLを出力)

  3. ApacheのようなオープンソースのWebサーバーでしたら、mod_rewriteモジュールを使用したり、ソースを改造して、CGIのURLを
    http://www.example.com/cgi/bbs/XXXX.html
    に書き換える。(動的にHTMLファイルのURLを出力)注)3

上記の項a以外は、ロボット(クローラ)やロボット検索からアクセスする人は、必ずCGIでの処理になり、サーバーに負担をかけることになります。また、項のbとcについては、クローラを終わりのないトラップ(罠)にはめたり、同じURLを何度も収集させることになったりします。もともと、クローラが収集を嫌がっているのですから、お薦めできません。自宅サーバーでしたら、Web容量はGbyte単位のはずですから、迷うことなく項aを選択しましょう。もし私と同じ掲示板をご使用でしたら、「質問A902.KENT WEBさんの掲示板(WEB FORUM)の過去ログファイルから、htmlファイルを作成するには?」をご参照の上、ダウンロードしてご使用願います。

注)
  1. 引数は、「湯桶(ゆとう)読み」で、「ひきすう」と呼びます。正しくは「いんずう」や「ひきかず」と呼ぶのが正しいと思います。電話で誤解されないように、110番のことを「ひゃくとうばん」と言ったり、20時47分のことを「ふたまるよんななじ」と言っているのと同じ感覚です。
  2. 勿論、この手のHTMLファイルは、自動的に作成しないと体力が持ちません。また、ちょっとした注意も必要です。Web マスターのための Google情報に記載されていたのですが、1ページあたりのリンク数は、100未満でないとダメのようです。
  3. 参考サイト:HotWired Japan Webmonkey business いかがわしくないサーチエンジン対策 (第1回)

4. 全文検索システムの検討

検索エンジンサイトに自サイト内の文書検索を行ってもらう方法で述べましたが、この方法の欠点は、1ヶ月以内に作成された最新の文書が検索できないことです。また、全ての文書が登録され検索できるという検証が困難なことです。文書が増えるに従って、やはり自サイト専用の全文検索システムを導入することにしました。Windows 2000の自宅WWWサーバー(AN HTTPD)での全文検索システム用ソフトウェアの検討と選定にあたっては、以下のサイトを参考にしました。

  1. 日本語全文検索エンジンソフトウェアのリスト
  2. 全文検索ソフト(Perl版)徹底比較

結局、Perlで書かれた「とほほのWWW入門」さんの「WwwSearch利用メモ」とC言語で書かれた「全文検索システムNamazu for Win32」が残り、最終的には、Namazu for Win32にしました

Namazu 2.0.14 for Win32 (β版) は、Active perl 5.8に対応し、Webページの文字コードがUTF-8でも索引の作成ができる様になりました。また、MSIパッケージ化され、インストールが驚くほど簡単になりました。

ところで、Namazuは、普通に設定しますと、Webサーバーから、http://www.example.com/cgi-bin/Namazu.cgi.exeというWindowsの実行ファイル形式で実行しなければなりませんので、セキュリティ上、そのまま使用することは、危険だと判断しました。従って、Namazu.cgi.exeというファイル名をNamazu.ccgiというファイル名に変更し、これを実行ファイルとして実行するように設定しました。(AN HTTPDでは、「一般」タブの拡張子の「.exe」を「.ccgi」に変更するだけ)

導入した結果論ですが、「全文検索システムNamazu for Win32」とインデックスキーを作成する「わかち書き」用辞書の「kakashi」のインストールは、極めて簡単であり、応答も極めて良好で満足のいくものでした。並びかえられたインデックスキーを2分検索(Binary Search)するわけですから、インデックスキーが2倍の量になったとしても、今後も応答速度の低下は、体感できないでしょう。

5. namazuのインストールでの追記事項

インストールについては、「全文検索システムNamazu for Win32」のサイトの参考になるページを見て、設定を行いました。有用なフリーソフトと設定Webページをご提供して頂き、ありがとうございました。同じことを書いてもムダですので、上記のサイトを読んでインストールして検証して頂きたいのですが、このWebページでは、簡単なインストールの流れと私が変更したり、追加した事項を中心に説明します。

  1. ダウンロード

    ActivePerl 5.8.6.811は、既にインストール済で、かつ動作検証済であるということを前提としています。「全文検索システム Namazu for Win32」のサイトの「ダウンロード」の項から、「nmz2014beta.exe(1,480,992 byte)」をダウンロードします。また、「必要なソフト」の項から、「kakasi-2.3.4.zip (約 1,058KB)」をダウンロードします。(2005年2月2日現在

  2. ダウンロードしたファイルの解凍とインストール

    ダウンロードした「kakasi」をシステムドライブ以外のDドライブのルートであるD:\にて解凍します。するとD:\kakashiという場所にフォルダが生成されます。異なった場所に解凍した場合は、このフォルダに移動させて下さい。

    また、ダウンロードした「Namazu」をシステムドライブ以外のDドライブのルートであるD:\にて解凍実行します。するとD:\namazuという場所にフォルダが生成され、インストールされます。インストール時には、Cドライブとなっているドライブを全てDドライブに変更します。

  3. 環境変数の確認と変更

    Windows 2000では、デスクトップの「マイコンピュータ」というアイコンを右クリックして、「プロパティ」を左クリックし、「詳細設定」タブの「環境変数」ボタンをから、環境変数の設定と変更が出来ます。

    環境変数の確認
    環境変数 備考
    HOME D:\namazu 追加して作成しなければならなかった
    ITAIJIDICTPATH D:\kakasi\share\kakasi\itaijidict システムドライブのCになっていたので、変更した
    KANWADICTPATH D:\kakasi\share\kakasi\kanwadict 同上
    LANG ja_JP.SJIS -
    MKNMZRC D:\namazu\etc\namazu\mknmzrc -
    NAMAZULOCALEDIR D:\namazu\share\locale -
    NAMAZURC D:\namazu\etc\namazu\namazurc -
    Path D:\namazu\bin;D:\Perl\bin\;C:\WINNT;他 D:\namazu\bin;というパスが追加されていることを確認のこと。
  4. CGIで実行するための追加作業

    下表に、インターネットWebサーバーとnamazuのフォルダ配置例を示します。WebサーバーがAN HTTPDの場合は、セキュリティと応答速度を意識したWWWサーバー(AN HTTPD)設定例も合わせてご参照願います。

    追加作業は、「D:\namazu\share\namazu\template.jp」というフォルダを作成して、templateフォルダより、拡張子が「.ja」のファイルをコピーすることと、実行パス下に「namazu.ccgi」を設置するだけです。WebサーバーがAN HTTPDの場合は、「一般」タブの拡張子の「.exe」を「.ccgi」に変更して、拡張子「.ccgi」が実行ファイルとして実行可能にして下さい。「--self--」で実行することになります。

    インターネットWebサーバーとnamazuのフォルダ配置例
    番号 WebページのURL(URI)他 主たるファイルのローカルパス
    1 (AN HTTPDをD:\www\httpdにインストール) D:\www\httpd\httpd.exe
    2 (Active PerlをD:\Perlにインストール) D:\Perl\bin\perl.exe
    3 (kakasiをD:\kakasiにインストール) D:\kakasi\share\kakasi\kanwadict
    4 (namazuをD:\namazuにインストール) D:\namazu\libexec\namazu.cgi.exe
    5 (namazuの検索結果表示用テンプレート画面用初期フォルダ) D:\namazu\share\namazu\template
    6 (同上から、拡張子が「.ja」のファイルをコピーしたフォルダを作成 D:\namazu\share\namazu\template.jp
    7 http://www.example.com/index.html D:\www\public_html\index.html
    8 http://www.example.com/cgi/namazu.ccgi D:\www\cgi-bin\namazu.ccgi
    番号)
    1. ダウンロードした解凍ファイルのhttpd本体のファイルを示しています。
    2. Active Perlをインストール後のPerl本体のファイルを示しています。
    3. kakasiをインストール後の辞書本体のファイルを示しています。
    4. namazuをインストール後のCGI実行ファイルの本体を示しています。
    5. namazuの検索結果表示用テンプレート画面用フォルダで、初期状態のフォルダとして、そのまま残しておく
    6. インストール直後にtemplate.jpフォルダを作成し、templateフォルダより拡張子が「.ja」のファイルをコピーすること。namazuの検索結果表示画面はインデックス作成時に、このフォルダの内容に従って、作成されます。
    7. ホームページ(トップページ)本体のファイルを示しています。httpのドキュメントルート(一般パスのルート)は、D:\www\public_htmlフォルダになります。
    8. ホームページのnamazuのCGIファイルを示しています。このファイルは、この表の項4の「namazu.cgi.exe」をコピーして、「namazu.ccgi」にファイル名を変更したものです。CGIのドキュメントルート(実行パスのルート)は、D:\www\cgi-binフォルダになります。この実行パス下に設置するのは、「namazu.ccgi」のファイルだけです。namazuの環境設定ファイルの「.namazurc」は、設置しません
  5. (2006.02.11追記)PDFファイルをインデックスに追加する作業

    PDFを検索対象にYet Another Namazu セットアップメモ□pdfを参考に設定を行いました。

    1. ftp://ftp.foolabs.com/pub/xpdf/から、最新版のxpdf-3.01pl2-win32.zipとxpdf-japanese.tar.gzを入手。
    2. xpdf-3.01pl2-win32.zipから、パスの通っているD:\namazu\bin\にpdftotext.exeとpdfinfo.exeとsample-xpdfrcをコピー。その後にsample-xpdfrcをxpdfrcにリネーム。
    3. xpdf-japanese.tar.gzを解凍して、出来たxpdf-japaneseというフォルダ名をjapaneseに変更して、D:\namazu\bin\に移動。
    4. D:\namazu\bin\japanese\add-to-xpdfrcをテキストエディタで開き、この内容をD:\namazu\bin\xpdfrcファイルに追記。
    5. 追記部分の「/usr/local/share/xpdf/japanese/」を「D:/namazu/bin/japanese/」に全て置換。D:\namazu\bin\xpdfrcファイルの追記部分は、本例では、以下のようになります。
      #----- begin Japanese support package (2004-jul-27)
      cidToUnicode      Adobe-Japan1  D:/namazu/bin/japanese/Adobe-Japan1.cidToUnicode
      unicodeMap        ISO-2022-JP   D:/namazu/bin/japanese/ISO-2022-JP.unicodeMap
      unicodeMap        EUC-JP        D:/namazu/bin/japanese/EUC-JP.unicodeMap
      unicodeMap        Shift-JIS     D:/namazu/bin/japanese/Shift-JIS.unicodeMap
      cMapDir           Adobe-Japan1  D:/namazu/bin/japanese/CMap
      toUnicodeDir                    D:/namazu/bin/japanese/CMap
      #displayCIDFontTT Adobe-Japan1  /usr/..../kochi-mincho.ttf
      #----- end Japanese support package
      
      ここで、指定するパスは、絶対パスでなければなりません。絶対パスの「D:/namazu/bin/japanese/」を相対パスの「./japanese/」と書いていると、パスワードなしのPDFファイルでも「Unable to convert pdf file (maybe copying protection)」というエラーが発生したり、「未対応の形式 (application/pdf)無視します」というエラーが発生して、namazuのインデックスの作成に失敗します。
      コマンドプロンプト画面より
      D:\namazu\xpdf\pdftotext.exe -enc EUC-JP -raw XXX.pdf XXX.txt
      として、XXX.txtに正常にテキストファイルが作成出来ていても、namazuのインデックスの作成に失敗します。本例で後述するNamazuMakeKey.batの様にbatファイルから、mknmz.batをcallコマンドで呼び出している場合は、特に絶対パスでなければなりません。
  6. (2006.02.11追記)AUTO CADのJWGファイルをインデックスに追加する作業

    1. DWG FILTER FOR NAMAZU(WindowsNT-2000-XP-ビジネス)からダウンロードして解凍。
    2. 本例では、acadtotext05.exeをD:\namazu\bin\にコピー。
    3. acad.plをD:\namazu\share\namazu\filter\にコピー。
    4. mknmzrcファイルの$ALLOW_FILEに"|.*\\.dwg"を追加。

    詳細は、ダウンロードした同梱のreadme.txtに掲載されていました。

6. namazuの基本設定

大規模な検索エンジンと同様にnamazuもあらかじめ索引(インデックス)を作成します。簡単に言いますと、この索引は検索対象文書の検索語となる単語1つ1つに対して、どの文書に何語使用されているかを記録したデータです。日本語の検索対象文書は、英語等の単語と単語の間が半角スペース等で区切られている文書と同様に処理するために、分かち書き(単語と単語の間に半角スペース等の区切り符号を挿入)という処理が必要になります。

ユーザーがnamazuで検索する場合は、上記の索引(インデックス)にアクセスして、その結果と検索対象となる文書へのリンクを表示します。Webサーバーで検索サービスを提供するのに必要なファイルは、本例では、検索エンジン[ namazu.cgi.exe ]とその環境設定ファイル[ D:\namazu\etc\namazu\namazurc ]と索引(検索結果表示用HTMLファイルを含む)ファイルだけです。従って、クライアント機にサーバー側と同じ文書が存在する場合は、クライアント機で索引(インデックス)ファイルを作成することも出来ます。

前項のフォルダ配置例で、
 namazuの索引(インデックス)作成用環境設定ファイル[ D:\namazu\etc\namazu\mknmzrc ]

 検索エンジンnamazu用環境設定ファイル[ D:\namazu\etc\namazu\namazurc ]
基本設定ファイルの変更を行います。下記に私の行った設定例を示します。

  1. 索引(インデックス)作成コマンド(mknmz.bat)用環境設定ファイル(mknmzrc)の編集

    (2004年06月15日 追記)$ADDRESSは、必ず変更して下さい。ここを変更しないと、文書数やキーワード数やインデックスの最終更新日が更新されません。

    namazuの索引(インデックス)作成用環境設定ファイル[ D:\namazu\etc\namazu\mknmzrc ]
    のコメント部分を省略した内容(初期状態は、同じフォルダ内のmknmzrc-sample.win32と同じ内容)

    package conf;  # Don't remove this line!
    # $ADDRESS = 'webmaster@foo.bar.jp';
    $ADDRESS = 'webmaster@example.com'; # <--- 必ずサイト管理者のメールアドレスを記載して下さい。2004.06.15 追記。
    # $HTML_SUFFIX = "html?|[ps]html|html\\.[a-z]{2}";
    # $ALLOW_FILE = ".*\\.(?:$HTML_SUFFIX)|.*\\.txt" . # HTML, plain text
    #       "|.*\\.gz|.*\\.Z|.*\\.bz2" .             # Compressed files
    #       "|.*\\.pdf|.*\\.ps" . # PDF, PostScript
    #       "|.*\\.tex|.*\\.dvi" . # TeX, DVI
    #       "|.*\\.rpm|.*\\.deb" . # RPM, DEB
    #       "|.*\\.doc|.*\\.xls|.*\\.ppt" . # Word, Excel, PowerPoint
    #       "|.*\\.j[sabf]w|.*\\.jtd" .        # Ichitaro 4, 5, 6, 7, 8
    #       "|\\d+|[-\\w]+\\.[1-9n]";          # Mail/News, man
    # $DENY_FILE = ".*\\.(gif|png|jpg|jpeg)|.*\\.tar\\.gz|core|.*\\.bak|.*~|\\..*|\x23.*";
    # $EXCLUDE_PATH = undef;
    # $DIRECTORY_INDEX = "";
    # $REMAIN_HEADER = "From|Date|Message-ID";
    # $SEARCH_FIELD = "message-id|subject|from|date|uri|newsgroups|to|summary|size";
    # $META_TAGS = "keywords|description";
    # %FIELD_ALIASES = ('title' => 'subject', 'author' => 'from');
    # $NON_SEPARATION_ELEMENTS = 'A|TT|CODE|SAMP|KBD|VAR|B|STRONG|I|EM|CITE|FONT|U|'.
    #                        'STRIKE|BIG|SMALL|DFN|ABBR|ACRONYM|Q|SUB|SUP|SPAN|BDO';
    # $ON_MEMORY_MAX   = 5000000;
    # $FILE_SIZE_MAX   = 2000000;
    # $TEXT_SIZE_MAX   =  600000;
    # $WORD_LENG_MAX   = 128;
    # %Weight =
    #     (
    #      'html' => {
    #          'title'  => 16,
    #          'h1'     => 8,
    #          'h2'     => 7,
    #          'h3'     => 6,
    #          'h4'     => 5,
    #          'h5'     => 4,
    #          'h6'     => 3,
    #          'a'      => 4,
    #          'strong' => 2,
    #          'em'     => 2,
    #          'kbd'    => 2,
    #          'samp'   => 2,
    #          'var'    => 2,
    #          'code'   => 2,
    #          'cite'   => 2,
    #          'abbr'   => 2,
    #          'acronym'=> 2,
    #          'dfn'    => 2,
    #      },
    #      'metakey' => 32, # for <meta name="keywords" content="foo bar">
    #      'headers' => 8,  # for Mail/News' headers
    # );
    # $INVALID_LENG = 128;
    # $MAX_FIELD_LENGTH = 200;
    # $NKF = "module_nkf";
    # $KAKASI = "module_kakasi -ieuc -oeuc -w";
    # $CHASEN = "chasen -j -F '\%m '";
    # $CHASEN_NOUN = "chasen -j -F '\%m %H\\n'";
    # $WAKATI  = $KAKASI;
    $LIBDIR = 'D:/namazu/share/namazu/pl';
    $FILTERDIR = 'D:/namazu/share/namazu/filter';
    $TEMPLATEDIR = 'D:/namazu/share/namazu/template.jp'; # <--- 注1
    

    注1.インデックス作成時、このフォルダ内のテンプレート用ファイルにインデックス作成日やインデックス文書数などが埋め込まれて、検索結果表示用HTMLファイルの一部が作成されます。

    このファイルは、基本的に$ADDRESS以外は、そのまま使用しても構わないようで、多分何も変更しなければ、コメントになっている内容通りの設定になっていると考えます。念のため、赤字の部分の#を消して、再定義しました。再定義した変数は、$ON_MEMORY_MAXと$FILE_SIZE_MAXと$TEXT_SIZE_MAXと$WORD_LENG_MAXと$INVALID_LENGと$MAX_FIELD_LENGTHと$KAKASIと$WAKATIです。

  2. 検索エンジンnamazu用環境設定ファイル(namazurc)の編集

    検索エンジンnamazu用環境設定ファイル[ D:\namazu\etc\namazu\namazurc ]
    のコメント部分を省略した内容(初期状態は、同じフォルダ内のnamazurc-sample.win32と同じ内容)

    Index         D:\namazu\var\namazu\index
    #Template      D:\namazu\share\namazu\template
    # ↓ 文書数やキーワード数や更新日を表示する場合、上記のIndexやNamazuMakeKey.batで作成した索引を指定すること。←2004年06月15日 追記
    Template      D:\namazu\var\namazu\index\past ←2004年06月15日 追記
    #Replace       /home/foo/public_html/  http://www.foo.bar.jp/~foo/       /D\|/WWW/public_html/       /
    #Logging       off
    Lang          ja_JP.SJIS
    #Scoring       tfidf
    #EmphasisTags  "<strong class=\"keyword\">"   "</strong>"
    #MaxHit    10000
    #MaxMatch  1000
    #ContentType    "text/x-hdml"
    

    赤字の部分の#を消して、赤字の部分の変更を行いました。再定義した変数は、TemplateとReplaceとEmphasisTagsとMaxHitとMaxMatchです。バーチャルホストを使用していないWebサーバーでは、Replaceで定義するHTMLファイルのドキュメントルートは、「/」と書くだけで良いです。

    namazuで検索した結果で表示されるHTMLファイルは、この環境設定ファイルのTemplateで設定したフォルダにあるファイルです。

7. インデックスの作成例

追加作業は、「D:\namazu\share\namazu\template.jp」というフォルダを作成して、templateフォルダより、拡張子が「.ja」のファイルをコピーすることと、WWWサーバーの実行パス下に「namazu.ccgi」を設置するだけです。WebサーバーがAN HTTPDの場合は、「一般」タブの拡張子の「.exe」を「.ccgi」に変更して、拡張子「.ccgi」が実行ファイルとして実行可能にして下さい。「--self--」で実行することになります。

インターネットWebサーバーとnamazuのインデックスフォルダ配置例
番号 WebページのURL(URI)他 主たるファイルのローカルパス 備考
1 (D:\namazuにインストールしたインデックスフォルダ) D:\namazu\ver\namazu\index 索引(インデックス)用フォルダ
2 Webデータ用の検索キーを格納するフォルダ D:\namazu\ver\namazu\index\web Webページの索引用フォルダ
3 掲示板過去ログ用の検索キーを格納するフォルダ D:\namazu\ver\namazu\index\past 掲示板過去ログの索引用フォルダ
4 http://www.example.com/index.html D:\www\public_html\index.html Webページとして検索対象にする
5 http://www.example.com/img/baner.gif D:\www\public_html\img\baner.gif 検索対象にしない
6 http://www.example.com/BBS/BBSXX.html D:\www\public_html\BBS\BBSXX.html 過去ログとして検索対象にする
7 http://www.example.com/temp/OldFile.html D:\www\public_html\temp\OldFile.html 検索対象にしない
8 http://www.example.com/cgi/namazu.ccgi D:\www\cgi-bin\namazu.ccgi 検索CGI実行ファイル本体。
番号)
  1. namazuをインストールした直後の索引フォルダ(インデックスフォルダ)を示しています。
  2. 上記の索引フォルダ下にWebページの索引用フォルダ(web)を新規に作成します。
  3. 上記の索引フォルダ下に掲示板の過去ログの索引用フォルダ(past)を新規に作成します。
  4. ホームページ(トップページ)本体のファイルを示しています。このフォルダ以下は基本的に検索対象にします。WWWサーバーのドキュメントルート(一般パスのルート)は、D:\www\public_htmlフォルダになります。
  5. 画像ファイルなどを設置している画像フォルダの例です。WWWサーバーのドキュメントルート下にありますが、検索対象にしません。
  6. 掲示板の過去ログより生成されたHTMLファイルなどで、WWWサーバーのドキュメントルート下にありますが、Webページとしては、検索対象にしません。ただし、過去ログとして別に検索対象にします。
  7. 古いファイルや一時的なフォルダ内のファイルは、検索対象にしません。
  8. 全文検索namazuのCGI実行ファイルを示しています。CGIのドキュメントルート(実行パスのルート)は、D:\www\cgi-binフォルダになります。

上記のフォルダ配置例で、下記に私の作成したバッチファイルを紹介します。このバッチファイルは、どこに設置しても動作します。勿論、デスクトップに設置しても可能です。

NamazuMakeKey.batの内容

@echo off
D:
cd    \www\cgi-bin\bbs
echo ***過去ログHTMLファイルを生成します。***
perl  PastList.pl
echo .
echo ***生成した過去ログHTMLファイルをドキュメントルート下のフォルダにコピーします。***
xcopy D:\www\cgi-bin\bbs\past  D:\www\public_html\BBS  /D /E /V /Q /Y
del   D:\www\public_html\BBS\*.cgi   /Q
echo .
echo ***namazuの検索キーを更新します。***
call  mknmz  -O  D:\namazu\var\namazu\index\past  D:\WWW\public_html\BBS
call  mknmz  -O  D:\namazu\var\namazu\index\pub   D:\WWW\public_html     --exclude="(img|temp|BBS)"
echo .
pause 処理がすべて終了しました。

8. 検索画面の変更例

検索画面の変更は、今までのフォルダ配置例と設定ファイルでは、D:\namazu\share\namazu\template.jpフォルダ内のファイルを編集して行います。ファイルの編集には、EUC(拡張UNIXコード)で編集しなければなりませんので、注意して下さい。多機能な新しいソフトをインストールして、操作を覚えたくない方には、Windows 95/98/Me/NT4.0/2000/XPに対応しているメモ帳++で、直接編集されることをお薦めします。

下記のテンプレートファイルは、Webページ検索と掲示板の過去ログ検索に対応した私のサイトで使用しているHTML4.01strict形式のファイルです。

  1. NMZ.head.ja(全ての画面のヘッダ部分です。変更箇所:掲示板の過去ログの別検索とGoogleのサイト内検索を追加。)

    HTMLヘッダの内容

    Namazu による全文検索システム

    最新の内容の検索は、できませんがGoogleでも当サイトの文書(****文書)が検索できます。

    現在、<!-- FILE --> 0 <!-- FILE --> の文書がインデックス化され、 <!-- KEY --> 0 <!-- KEY --> 個のキーワードが登録されています。

    インデックスの最終更新日: <!-- DATE --> date <!-- DATE -->


    検索式: [検索方法]

    表示件数: 表示形式: ソート:

    検索対象:  Webページ  掲示板過去ログ   □ 掲示板過去ログ(分類版)

    Google: Googlize!で簡単設置。


  2. NMZ.body.ja(検索式の説明部分です。変更箇所:説明部分を字下げ。)

    HTMLヘッダの内容

    検索式

    単一単語検索

    調べたい単語を一つ指定するだけのもっとも基本的な検索手法です。

    例: namazu

    AND検索

    ある単語とある単語の両方を含む文書を検索します。検索結果を絞り込むのに有効です。3つ以上の単語を指定することも可能です。単語と単語の間に and を挿みます。

    例: Linux and Netscape

    and は省略できます。単語を空白で区切って羅列するとそれらの語すべてを含む文書をAND検索します。

    OR検索

    ある単語とある単語のどちらかを含む文書を検索します。3つ以上の単語を指定することも可能です。単語と単語の間にor を挿みます。

    例: Linux or FreeBSD

    NOT検索

    ある単語を含み、ある単語を含まない文書を検索します。3つ以上の単語を指定することも可能です。単語と単語の間にnot を挿みます。

    例: Linux not UNIX

    グループ化

    AND検索、OR検索、NOT検索を括弧でグループ化できます。括弧の両隣には空白を入れる必要があります。

    例: ( Linux or FreeBSD ) and Netscape not Windows

    フレイズ検索

    2語以上からなる複合語を検索します。 "..." と2重引用符で、あるいは {...} と中括弧で囲みます。Namazuのフレイズ検索は精度が 100 % ではないため、ときどき誤ることがあります。

    例: {GNU Emacs}

    部分一致検索

    部分一致検索には前方一致、中間一致、後方一致の 3種類があります。

    前方一致検索
    inter* (inter から始まる単語を含む文書を検索)
    中間一致検索
    *text* (text を内包する単語を含む文書を検索)
    後方一致検索
    *net (net で終わる単語を含む文書を検索)

    正規表現検索

    検索するキーワードを正規表現で指定します。正規表現は /.../ のようにスラッシュ記号で囲みます。正規表現のエンジンにはRubyのコードを利用しています。正規表現の書式はPerlとほぼ同じです。

    例: /インター?フェ[イー]ス/

    フィールド指定の検索

    Subject:, From:, Message-Id: といったフィールドを指定して検索する手法です。特にMail/News のファイルを扱う際に効果を発揮します。

    例:

    • +subject:Linux
      (Subject: に Linuxが含まれる文書)
    • +subject:"GNU Emacs"
      (Subject: に GNU Emacsが含まれる文書)
    • +from:foo@bar.jp
      (From: に foo@bar.jp が含まれる文書)
    • +message-id:<199801240555.OAA18737@foo.bar.jp>
      (Message-Id を指定)

    特記事項

    • いずれの検索方法でもアルファベットの大文字・小文字の区別はしません。
    • 日本語の複合語は形態素単位に分割し、それらをフレイズ検索します。分割は不適切に行なわれることがあります。
    • JIS X 0208 (いわゆる全角文字) の英数字と記号の一部 (ASCIIと重複しているもの) は ASCII (いわゆる半角文字) として処理されます。
    • 記号を含む語の検索ができます。例: TCP/IP。ただし、記号の処理は完全ではないので TCP and IP のように分割してAND検索をかけた方が取りこぼしがありません (その代わり余計なファイルまでヒットしてしまう可能性があります)。
    • 中間一致・後方一致、正規表現、フィールド指定の検索には少し時間がかかります。
    • and, or, not を単語として検索したいときはそれぞれ、 "..." と2重引用符で、あるいは {...} と中括弧で囲みます。

  3. NMZ.tips.ja(検索のコツ表示部分です。変更箇所:文法上の書式変更。)

    NMZ.tips.ja部分

    検索のコツ

    検索がうまくいかないときは、次の点を確認してください。

    • キーワードの綴りを確かめる
      キーワードの綴りが間違っていると検索できません。
    • キーワードを増やしてみる
      検索結果が何もない、あるいは少ないときは、関連するキーワードをor を挿んで羅列してみましょう。ヒットしやすくなります。
      例: tex or ptex or latex or latex2e
      検索結果が多すぎるときは、関連するキーワードをand を挿んで羅列してみましょう。検索結果を絞り込めます。
      例:latex and dvi2ps and eps
    • 部分一致検索を試してみる
      検索結果が何もない、あるいは少ないときは、部分一致検索を試してみましょう。
      tex* を入力すると、tex から始まる単語 (tex,texi2html, texindex, text など) を検索できます。
      *tex を入力すると、tex で終わる単語 (bibtex,jlatex, latex,platex, ptex, vertexなど) を検索できます。
      *tex* を入力すると、tex を含む単語 (たくさん) を検索できます。
    • 日本語がでたらめにわかち書きされてしまう
      { [ 最: 1 ] [ 新: 0 ] [ 情: 0 ] [ 報: 0 ] :: 0 } のように、でたらめにわかち書きされることがあります。これは、そもそも最新情報という言葉が検索対象に含まれないことを意味します。検索はあきらめましょう。
    • 長いカタカナ語の検索がうまくいかない
      マルチパート で検索できないときは "マルチパート" と分割してみてください。検索時にはカタカナ語の分割は行われないため、インデックス (本の索引のようなもの -検索を高速に行うために使います) 作成時にカタカナ語が分割されていると、正しく検索できません。
    • フレイズ検索をしたが、そのフレイズを含まない文章までヒットしてしまった
      これは仕様です。 Namazu のフレイズ検索は精度が 100 % ではないため、ときどき失敗します。
    • and, or, not を単語として検索したい
      それぞれ、 "..." とダブルクォウテイションマークで、あるいは {...} と中括弧で囲みます。
  4. NMZ.result.normal.ja(検索結果の「標準」表示部分です。変更箇所:日付と著作表示を消去。)

    NMZ.result.normal.ja部分
    ${namazu::counter}. ${title} (スコア: ${namazu::score})
    ${summary} (${size} bytes)
  5. NMZ.result.short.ja(検索結果の「簡易」表示部分です。変更箇所:文法上の書式変更。)

    NMZ.result.short.ja部分
    ${namazu::counter}. ${title} (スコア: ${namazu::score})
  6. NMZ.foot.ja(全ての画面のフッタ部分です。変更箇所:文法上の書式変更。)

    NMZ.foot.ja部分

    この全文検索システムはNamazu v2.0.14 によって構築されています。

    webmaster@example.com

上記のテンプレートファイルで宜しければ、Namazu 2.0.14 for Win32用のテンプレートファイルRev.1.03をダウンロードして、ご使用して下さい。この圧縮ファイルには、説明書(README.txt)とHTML4.01strictとXHTML1.0strict形式の2種類のテンプレートファイルとおまけ(Shift_JISコードのNamazu.html)が含まれます。HTMLファイルの文法検査は、Another HTML-lint gatewayにて確認しました。

ちょっと戸惑うかもしれませんが、テンプレートファイルは、EUC(拡張UNIXコード)で書きますが、namazu.cgi.exe が出力するHTMLファイルのコードは、Shift_JISコードだということです。

XHTML1.0strictでは、namazu.cgi.exeが生成するタグには、以下の文法上の不具合が生じます。

これが原因でブラウザが誤動作するとは思えないので、気にならない場合は、XHTML1.0strict をご使用下さい。

この解凍したテンプレートフォルダNamazuTemplate103をX:\namazu\share\namazuに移動し、namazuの索引(インデックス)作成用環境設定ファイル[ D:\namazu\etc\namazu\mknmzrc ]の下記の行を
  #Template D:\namazu\share\namazu\template
  Template D:\namazu\share\namazu\NamazuTemplate103\templateHTML401
と変更すれば、テンプレートの追加設定は、終了します。

本例では、NamazuMakeKey.batによるインデックス作成時、このtemplateHTML401というフォルダ内のテンプレートファイルにインデックス作成日やインデックス文書数などが埋め込まれて、D:\namazu\var\namazu\index\pastのフォルダ内に検索結果表示用テンプレートファイルが作成されます。

9. Webページへのnamazu検索窓の設置方法

Webページへnamazuの検索窓を設置する場合、通常のnamazu検索画面の様な配置では場所をとるため、簡易的な検索にならざるをえません。基本的には、以下の様な「検索キーの入力欄」と「検索の実行ボタン」の2点にして、そのinputタグのほとんどは、hidden属性にすることになります。

Namazu: [説明]

Webページのnamazuの検索窓のタグ

<!--Namazu による全文検索システム-->
<form action="/cgi-bin/namazu.ccgi" method="get">
<p>
<a href="http://www.namazu.org/"><strong>Namazu:</strong></a>
<input               name="query"   value="123" size="30" accessKey="T" tabIndex="10">
<input type="hidden" name="whence"  value="0">
<input type="hidden" name="max"     value="20">
<input type="hidden" name="result"  value="normal">
<input type="hidden" name="sort"    value="score">
<input type="hidden" name="idxname" value="pub,past">  注)
<input type="submit"                value="検索" accessKey="S" tabIndex="11">
[<a href="/cgi-bin/namazu.ccgi">説明</a>]
</p>
</form>
注)<input type="hidden" name="idxname" value="pub">
    <input type="hidden" name="idxname" value="past">
    という様に2行に分けて書くと文法エラーになります。

上記の検索ボタンを押しますと、

として、検索が実行され、URLは以下の様になって結果が表示されます。
http://sakaguch.com/cgi/namazu.ccgi?query=123&whence=0&max=20&result=normal&sort=score&idxname=pub&idxname=past

HTMLタグを書く要領がわかれば、簡単ですから、Webページの中にも簡易的なnamazu検索窓を是非、設置しましょう。

10. Namazuの更新

  1. 当サイトのWebページの文字コードは、UTF-8です。クライアント機にミラーサイトを作成していますので、Namazu 2.0.14を使用して、クライアント機で索引の作成を行っています。ただし、検索する文字コードは、まだUTF-8に対応されていない様なので、Webページの文字コードがUTF-8の場合は、検索文字の文字コード変換Perlスクリプト(Encodeモジュールを使用)の様な文字コードの変換CGIが必要となります。詳細は、Webページの検索文字コードをUTF-8からeuc-jp(Shift_JIS)にする方法をご参照願います。

  2. クライアント機にミラーサイトを作成して、クライアント機で作成した索引データをサーバーにアップロードする場合、サーバー側には、索引データとNamazu 2.0.14 for Win32 (β版) 同梱のnamazu.cgi.exeと検索エンジン用環境設定ファイル(namazurc)だけで検索が可能です。 従って、Namazuが更新されても、索引データの構造に変更がなければ、サーバー側は、namazu.cgi.exeとnamazurcの更新だけで済みます。

11. おわりに(雑多なこと)

全文検索システムの導入を検討し始めたのは、Webページの文書の量が50ページ以上になった2001年末頃から、考えていました。(掲示板のデータの検索の方は、全く考慮していませんでした。)この時点で考えていた検索システムは、Perlで書かれた「とほほのWWW入門」さんの「WwwSearch」でした。この時点の状況は、

でした。(WwwSearchに決めていた理由は、NamazuのCGIが拡張子が「.exe」の実行ファイルであったからです。セキュリティ上から、インターネットWebサーバーへの導入が、ためらわれました。)

2002年10月よりLAN内でのみの実験運用を行い、2003年1月28日に、「鷹の巣」の自宅サーバーに「全文検索システム Namazu for Win32」を導入しました。この時点の状況は、

でした。もし、私のサイトの掲示板がこんなにも利用されなかったら、私はPerlで書かれたWwwSearchを何の躊躇もなく導入していたでしょう。しかし、今後もこの調子で掲示板の過去ログが増大して行くと仮定しますと、どうしてもNamazuにしなければなりませんでした。

□WwwSearchに代表される検索キーを持たない全文検索システム
国語辞典で用語を調べるのに、用語が順番に並びかえられていない辞典。最初のページから、順に探して行かなければならない。検索時間は、文書量に比例。
□Namazuに代表される検索キーを持つ全文検索システム
国語辞典で用語を調べるのに、用語が順番に並んでいる辞典。国語辞典の真ん中のページを開いて見て、どちらに目的の用語があるのかが、直ぐにわかる。1回の検索で、検索対象ページを半減できる。2分検索(binary search)の検索時間は、文書量に比例しない。検索キーのデータが必要になりますが、自宅サーバーでしたら、Web容量は気にならないので、namazuがお薦めです。

理屈では、2分検索の素晴らしさをわかっていましたが、改めて再認識しました。今後、掲示板の過去ログが巨大化しても安心です。kakashiも含めて、Namazuは素晴らしい。そして、Namazuの開発者とWindowsサーバーにも移植して頂いた方々と素晴らしく丁寧な導入手順書をWebページに公開して頂いた先達の方々に厚くお礼申し上げます。

目次▲頁先頭