2011年7月 8日

[Namazu-users-ja 1220] Re:複数の条件の検索

寺西です。

(2011/07/07 6:56), 小田切亘 wrote:
> 基本を勉強しないで、対処療法でNMZ.head.ja、NMZ.body.ja、NMZ.foot.ja、
> namazu.cgiは何とか動作がつかめたので,欲をだしました。
>
> NMZ.field.xxxxxxというファイルがいくつか出来上がっていましたが、その意味
> がいまひとつ理解できませんでした。


インデックスファイルのファイルフォーマットはここに載っています。

http://www.namazu.org/doc/nmz.html.ja

NMZ.field.xxxx の xxxx がそれぞれフィールドになります。
このファイルはテキストファイル(UNIX改行、漢字コードはEUC-JP)で、
1行1文書で、文章ID順にそのフィールドの値が入っています。

つまり、NMZ.field.xxxx は、全文書のフィールド xxxx の一覧に
なっています。
例えば、NMZ.field.uri は全文書の URI の一覧であり、
NMZ.field.subject は全文書のタイトルの一覧になっています。

このため、全ての NMZ.filed.xxxx の行数は、ぴったり一致します。
# 一致していないとインデックスが壊れています。

例えば、NMZ.field.uri の 3行目に書かれている URI の文書の
subject フィールドの値は何かというと、NMZ.field.subject の
3行目を見ればいいということになります。
(対応付けは行で行います。)

検索結果に各文書のフィールドの値を出力するには、NMZ.result.xxx
の中で、${フィールド名} と書くと、検索結果を出力する際に
置換されます。

NMZ.result.normal.ja の中を見てみると、次のような行がありますが、

<dd><strong>著者>: <em>${author}</em></dd>

ここの ${author} が、該当する文書のフィールド(author)の内容
に置換されます。
(author は from の別名なので、NMZ.field.from に記録された
内容で置換します。)

フィールドの本来の目的は、テンプレートに記述した ${フィールド名}
を各文書固有の値に置換することです。
このため、Namazu ではシステムでいくつかデフォルトでフィールド
を使うため、インデックスを作ると NMZ.field.xxxx というファイルが
何種類か作られます。
これ以外にもフィールドを追加することができるので、今回は
genre、place、area を追加すれば目的は果たせそうですよ。

フィールドのもう一つの目的は、検索結果の並べ換えです。
複数件検索結果が得られた場合、フィールの値を使って並べ換える
ことができます。
著者名順とか、サイズ順とか URI 順というのは、それぞれに対応する
フィールドの値をキーにして、検索結果を並べ替えています。

最後に、フィールドの中身自体を検索に使う機能もあり、これが
フィールド検索になります。

> Namazu.cgiがPOSTでなく、GETからのデータ受け取りになっていることも、理解
> を妨げていました。

POST も GET も大きな違いはないはずですけど。

> namazu.cgiは改行が省かれているので、終わりの方の検索結果表示をカスタマイ
> ズするのに、沢山改行記号を挿入して、ようやく把握できました。

改行が省かれているというのはよくわかりませんが、
もしかして改行コードが違うという話ですかね。

> この複雑な表記のnamazu.cgiになるべく触らずに、フィールドをいろいろ使いこ
> なすことはできるのでしょうか。

フィールドの値を表示したり、検索結果のソートに使ったりぐらいは
もう使われていたりするのではないかと思います。

> もし、フィールドを駆使したサンプルなどを存知でしたら、是非ご恵示ください。

これじゃダメでしたでしょうか?

> <html>
> <head>
> <meta name="genere" content="00">
> <meta name="place" content="05">
> <meta name="area" content="11">
> </head>
> <body>
> :
>
> のようにしてフィールド値をMetaタグで仕込みます。
>
> 次に mknmzrc の $META_TAGS を次のように変更します。
>
> $META_TAGS = "genere|place|area";
>
> そして、インデックス作成時に mknmz に -M オプションを指定すると、
> 各 HTML の meta タグで指定した genere, place, area フィールド値
> から、NMZ.field.genere*, NMZ.field.place*, NMZ.field.area* を
> 含むインデックスが作成できます。

元文書が HTML じゃないようなので、

> 元文書が HTML でない場合にフィールド情報を仕込む手段はいろいろ
> ありますが、長くなるのでここでの説明は省略します。

これを示さないといけないかな?

本来だと、その文書用のフィルタを作って、そこでフィールドを切り出す
といったことをすればいいだけなんですが、それが難しいということなら、
簡易な方法を紹介します。

インデックスを作成した後、NMZ.field.uri の中身を確認しながら、
自分で NMZ.field.genre, NMZ.field.place, NMZ.field.area を作ります。
作成手段は問いません。手で入力しても、プログラムで作っても
何でもいいです。
重要なことは、UNIX形式で漢字コードはEUC-JP、あとは行の対応さえ
とれていれば良いのです。

NMZ.field.uri と NMZ.field.genre, NMZ.field.place, NMZ.field.area
の行数がぴったり一致することを確認して、rfnmz コマンドを実行
します。

http://www.namazu.org/doc/manual.html.ja#rfnmz

すると、NMZ.field.genre.i, NMZ.field.place.i, NMZ.field.area.i という
ファイルができ上がります。
これで、genre, place, area のフィールドが Namazu で使えるように
なりましたので、フィールド検索にこれらが使えます。

genre の 00 のものを検索したければ、+genre:00 と検索式に
入力すれば検索できます。

ただし、この方法だと、インデックスを更新してもこれらのフィールド
ファイルは更新されませんので、インデックスの更新の度にこれらの
フィールドファイルを作成して rfnmz を実行する必要があるということ
に注意してください。
--
=====================================================================
寺西 忠勝(TADAMASA TERANISHI) yw3t-trns@xxxxx
http://www.asahi-net.or.jp/~yw3t-trns/index.htm
Key fingerprint = 474E 4D93 8E97 11F6 662D 8A42 17F5 52F4 10E7 D14E
_______________________________________________
Namazu-users-ja mailing list
Namazu-users-ja@xxxxx
http://www.namazu.org/cgi-bin/mailman/listinfo/namazu-users-ja


投稿者 xml-rpc : 2011年7月 8日 02:23
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/104830
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。