How to use Freya ■ 索引の作成 (索引づけ, インデクシング) 索引は findex(1)を使って作成します。しかし,findexが入力として受け付け るのはFDIFファイルのみです。各種の文書ファイルをこのFDIFファイルに統一 してから,findexを起動することになります。FDIFファイルはXML文書のよう なものです(*1)。 text2fdif プレインテキストをFDIF形式に変換します。 html2fdif HTMLをFDIF形式に変換します。 mail2fdif RFC822に従ったメールをFDIF形式に変換します。 (*1) FDIFは一見するとXMLの適性形式に準拠しているように見えます。が, findexは任意のXML文書を受け付けるわけではありません。また,FDIF形式は XMLに適合していない部分もあります(Unicodeを採用していないなど)。さらに 現在のfindex(1)の実装は実験的なものであり,タグはすべて行頭から始まる 必要があるなど(^_^;,極めて制限の大きいものとなっています。そのため, 今後,FDIF形式を別のフォーマットに変更する可能性があります。わざわざ, XML風にしているのは今後を考えてのことではあるのですが。 ○ html2fdif を使う場合 html2fdifはlibwww-perl-5を使用するので,あらかじめインストールしておい てください。 html2fdif はファイル名とそのファイルに対応するURLを並べたリストを受け とり,それらのファイルをFDIF形式に変換して出力します。また,同時に.dsc ファイルも作成します。 まず,各行にファイル名(html2fdifを実行するディレクトリからの相対パスあ るいは絶対パス)と検索結果の表示に使用するURLをスペース句切りで並べたファ イルを用意します。 % cd /usr/local/etc/httpd % mkdir freya % find htdocs -name '*.html' -print | sed -e 's/\(.*\)/\1 \1/;s/ htdocs/ http:\/\/www.graco.c.u-tokyo.ac.jp/' > freya/web.list このリストを -f オプションで指定することで,変換が実行されます。-o オ プションには生成するファイルの名前を指定します。たとえば,-o hoge とし た場合,hoge.dsc と hoge.fdif が出力されます。省略すると -o default が 仮定されます。 % html2fdif -v -o freya/web -f freya/web.list FDIF形式のテキストが出力されたら,それをfindex(1)で処理することで索引 を作ることができます。 findexでも -o オプションで出力する索引の名前を指定します。-o hoge とす ると,hoge.lex, hoge.idx, hoge.map を出力します。省略すると "default" が指定されたものとみなされます。 デフォルトの形態素辞書以外を使うときは -d オプションで指定します。 % cd freya % findex -d /usr/local/lib/freya/dict/icot.dic -o web web.fdif 索引作成時にはテンポラリファイルが作られます。索引名の末尾に '_' がつ いたファイルがそうです。これらのファイルは実行時に消さないように注意し てください。 ○ mail2fdif を使う場合 mail2fdif はファイル名を並べたリストを受けとり,それらのファイルをFDIF 形式に変換して出力します。また,同時に.dscファイルも作成します。 処理対象のメールは,1メールにつき1ファイルになっている必要があります。 また,ヘッダ部分と本体部分が空行で句切られていなくてはなりません。 % mkdir ~/Indices % cd ~/Mail % find hoge-ml -type f -print > ~/Indices/hoge.list % mail2fdif -v -o ~/Indices/hoge -f ~/Indices/hoge.list % cd ~/Indices % findex -d /usr/local/lib/freya/dict/icot.dic -o hoge hoge.fdif ○ メーリングリストの検索システムを作りたい場合 mail2fdif作成した索引を fsearch.cgi で使うことも可能です。ただし,WWW 上で使う以上,一通一通のメールに適切なURLが存在する必要があります。次 のような手順で作業を行なえばよいでしょう。 メールから変換して作成されたHTMLファイルを,html2fdifで処理しても検索 可能にはなりますが,要約等が見苦しくなりがちです。それに,mail2fdifを 使えば,author:harada などの条件での検索が可能になります。 メール -------------------> HTML ==> WWW上に公開 | 1.hypermail/MHonArc / | / |2.mail2fdif <------ URL v FDIF --------------------> 索引 ==> 4. fsearch.cgi?style=mail 3.findex 1. まず,hypermail,MHonArc等のツールを使って,メールをHTMLに変換します。 2. 変換が終わったら,変換前のメールのファイル名とそのメールに対応するHTML ファイルのURLを空白文字で句切って並べたリストを用意し,そのリストを -f で指定して,mail2fdifで処理します。引数はhtml2fdifと同様です。 3. findex でFDIFファイルを索引づけします。 4. fsearch.cgiを設定します(詳細は後述)。このとき,表示スタイルを "mail" にします。 ■ ファイル構成 Freyaを使うことで作成されるファイルは以下のようになります。一セットの 索引につき,4つのファイルがfsearch(1), fsearch.cgi(1)によって使用され ることになります。 拡張子 概要 検索時に必要? 作成するプログラム hoge.fdif FDIF形式テキスト 不要 html2fdifなど hoge.dsc 検索結果表示用要約ファイル 要 html2fdifなど hoge.lex 索引ファイル(見出し語) 要 findex/fmerge hoge.idx 索引ファイル(本体) 要 findex/fmerge hoge.map 出現位置座標変換用ファイル 要 findex/fmerge icot.dic 形態素辞書 不要 mkicotdic,fmkmorphdic これらをすべてを合わせると(文書の内容によって変動しますが),元のテキス トの70%くらいの容量を占めることになります。ある程度のオーバーヘッドが あるため,大量のファイルを処理するほど,格納効率はよくなります。 ■ 索引のマージ fmerge(1)で複数の索引ファイルをマージし,一つにまとめることができます。 マージの対象となるのは,検索時と同様で,.dsc, .map, .lex, .idx の4つの ファイルです。 たとえば,base.{dsc,map,lex,idx}, news.{dsc,map,lex,idx}, local.{dsc,map,lex,idx} という3セット(12ファイル)の索引があるときにこ れらをまとめて all.{dsc,map,lex,idx} という索引を作るには,次のように します。 % fmerge all base news local 大量の文書(だいたい1万ファイル以上)を処理する場合は,数千ファイルずつ findexで索引づけし,最後にfmergeでマージするようにしたほうが確実でしょ う。findexも内部的には小さな索引ファイルを作り,最後にマージを行なうよ うに出来ています。 HTMLから作った索引とメールから作った索引を混ぜることも不可能ではありま せん。しかし,検索結果を表示する際はいずれか一種類(またはgeneric表示) を選ばなくてはなりませんので,あまり意味がないでしょう。 ■ コマンドラインからの検索 fsearch(1)を使うことでコマンドラインから検索できます。検索時には hoge.dsc, hoge.map, hoge.idx, hoge.lex という4種類の索引ファイルが必要 です。 Usage: fsearch [-s mail|html] [-f n] [-t n] -i index key [key ..] fsearchのオプションは以下の通りです。 -i index 索引ファイルの名前を指定します。.dsc, .map, .idx, .lexの 前につく名前を使います。省略すると "default" が仮定されます。 -s style 検索結果の表示スタイルを選択します。現在のところスタイルには "generic", "mail", "html" の3種類が用意されています。 デフォルトのgenericがもっとも一般的な出力ですが,mail2fdif を 使ってメールを索引づけ場合は -s mail を,html2fdif を使って HTMLを索引づけした場合は -s html を指定したほうがいいでしょう。 適切なstyleを選ばないと時刻表示等がおかしくなります。 -f n 検索結果をn番目から表示します。n は 1 以上です。 -t n 検索結果をn番目まで表示します。n は 1 以上です。 ■ CGIを使った検索 ○ CGIの準備 まず,CGI用ディレクトリを用意してください。cgi-binを直接使うのではなく, 専用のディレクトリを作ったほうがよいでしょう。たとえば, cgi-bin/fsearch/などを作ります。そこにmakeした cgi-bin/fsearch.cgi と パッケージに含まれている cgi-bin/head.html, cgi-bin/foot.html, cgi-bin/error.htmlをコピーします。 % cd /usr/local/etc/httpd % mkdir cgi-bin/fsearch % cp /usr/local/lib/freya/cgi-bin/fsearch.cgi cgi-bin/fsearch % cp /usr/local/lib/freya/cgi-bin/{head,foot,error}.html cgi-bin/fsearch また,検索時に必要な索引ファイルを同じディレクトリコピーします。 % cp freya/web.{dsc,map,idx,lex} cgi-bin/fsearch CGIを使うためのインターフェースとして,
タグを含んだHTMLを用意し ます。サンプルが cgi-bin/fsearch.html に用意されていますので,これを /usr/local/etc/httpd/htdocs/fsearch.html にコピーし,編集します。 % cp /usr/local/lib/freya/cgi-bin/fsearch.html htdocs もちろんfsearch.html以外のファイル名にしても構いませんし,既存のHTMLに を加えてもよいでしょう。 検索式:
パラメータ from, n, index は次のような意味になります。 from 検索結果をn番目から表示する。通常は0にします。 n 検索結果の表示数。最大で200です。 index 索引の名前。省略すると"default"を指定したことになります。 style 表示スタイルを指定します。省略すると"html"とみなされます。 index等を適切に指定したら,fsearch.html をWWWブラウザで閲覧し,検索を 実行してみます。うまく動いたでしょうか? 動かない場合は httpd のエラー ログを見るなどして,対応してみてください。 注: fsearch.cgi以外のファイル(索引ファイルやfoot.html)にアクセスした場 合にエラーになることを確かめてください。必要ないファイルが外部から見え てしまうとセキュリティホールになりかねません。 ○ ログについて fsearch.cgi は実行時のカレントディレクトリ(fsearch.cgiのあるディレクト リ)に fsearch.log というファイル名のログを書き込みます。動作確認の際に fsearch.logができていることも確かめてください。 出来ていないとすると,おそらくはパーミッションに問題があるのでしょう。 fsearch.logはCGIを実行するユーザーが作成できる・書き込める必要がありま す。CGIを実行するユーザーはWWWサーバーの設定にもよりますが,nobodyになっ ているのが普通です。 さて,CGIを置くディレクトリごと誰でも書き込めるようにしてもよいのです が,それはセキュリティの観点からはあまり好ましくありません。そこでここ では空の fsearch.log を作り,そのファイルだけ誰でも書き込めるようにし ます。 % cd cgi-bin/fsearch % touch fsearch.log % chmod a+w fsearch.log % chmod go-r fsearch.log あるいは特権ユーザーになって,所有者が nobody のファイルにしてもよいで しょう。 % su # cd cgi-bin/fsearch # touch fsearch.log # chown nobody fsearch.log ログの各行は次のような情報が記録されます: ・日時 ・アクセス元ホスト名(またはIPアドレス) ・ユーザー名(認証を行なっていない場合は "-") ・索引ファイル(省略時は"default") ・表示スタイル(省略時は"html") ・検索結果数(エラーの場合は -1) ・検索結果の何番目から表示しているか(1からスタート) ・一度に表示する検索結果数(検索結果総数より大きくなることがあります) 残りの部分には検索式が日本語EUCで記録されます。入力された内容そのまま ではなく,全角半角等の正規化が行なわれてから記録されます。検索式が入力 されなかった場合は "-" が記録されます。 例: 08 Jan 1998 05:44:09 JST ppp123.yonde.ne.jp - default html 34 1 20 foo bar ○ CGIのカスタマイズ fsearch.cgiによる検索が正しく動作したら,検索結果表示画面のカスタマイ ズを行ないます。さきほど cgi-bin/fsearch/ にコピーした,head.html, foot.html, error.htmlを編集してデザイン等を好みに合わせて変更してくだ さい。メールアドレスをWWWサーバー管理者のアドレスにするなどしてくださ い(your@mail.host.domになっている部分)。 head.html 検索に成功した場合に検索結果の前に表示されるHTML foot.html 検索に成功した場合に検索結果の後ろに表示されるHTML error.html 検索に失敗した場合に表示されるHTML 各HTMLには以下の変数(キーワード)を書くことができます。 $title タイトル。検索に成功した場合は「Result: 検索式 (#xx-#yy)」, 何も見つからなかった場合は「見つかりませんでした」 エラーになった場合はエラーの内容を表す文字列に置き換えられます $errormsg エラーが発生した場合にエラーの説明文に置き換えられます。 error.htmlにだけ書けばいいでしょう。 $query 検索式に置き換えられます。利用者が入力した検索式そのものでは なく,実際の検索に使用された検索式になっています。 (大文字・小文字の置き換えなど) $index 検索に使用した索引名に置き換わります。 $style 検索結果表示スタイル指定に置き換わります。 $result 検索結果数に置き換えられます。エラーの場合は0です。 $dispnum 一度に表示する検索結果数に置き換えられます。 これらの使用例は実際に cgi-bin/{head.html,foot.html,error.html}を見て ください。 複数の索引ファイルがあるときに選択して検索したい場合は,たとえば以下の ようにすればよいでしょう。
検索式:
○ CGIの出力をJIS(ISO-2022-JP)にする fsearch.cgiの出力は日本語EUCになっていますが,次のようなwrapperを用意 することで,ISO-2022-JPを出力させることも可能です。 #!/bin/sh ./fsearch.cgi | exec /usr/local/bin/nkf -j これを例えばfsearchj.cgi というファイル名でfsearch.cgiと同じディレクト リに置き,fsearch.cgiのかわりに使えばよいでしょう。 もちろん,/usr/local/bin/nkf の部分は適当に書き換えてください。単に exec nkf -j と書くと,nkf がCGIで許されるパスに存在する場合にしかうま く動かないので注意が必要です。 ------------------------------------------------------------ Copyright (c) 1997 HARADA Masanori. All rights reserved. $Id: MANUAL.ja,v 0.10 1998-01-08 08:22:28+09 harada Exp $