- 2008年9月10日 22:00
- 仕事のこと
ちょっとした野暮用で Hyper Estraier をインストールしてみることに。
インストール
下記の最新版を使用します。リンクは .tar.gz への直リンクです。
libiconv (1.12)
QDBM (1.8.77)
Hyper Estraier (1.4.13)
方針は「とりあえず Hyper Estraier を動かしてみましょう」なので、インストールは至極簡単な ./configure, make, make check sudo make install のお決まりのコースで。そもそもオプションもそんなに多くないみたい。
まずは libiconv から。
[travail@mina]~% wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.12.tar.gz [travail@mina]~% tar xzvf libiconv-1.12.tar.gz [travail@mina]~% cd libiconv-1.12 [travail@mina]~% ./configure --prefix=/usr/local [travail@mina]~% make [travail@mina]~% make check [travail@mina]~% sudo make install
スコンと入るので続いて QDBM。
QDBM は --enable-zlib オプションを使用します。Hyper Estraier がデータを圧縮する際に zlib を使用できるようにするオプションらしいです。
[travail@mina]~% wget http://qdbm.sourceforge.net/qdbm-1.8.77.tar.gz [travail@mina]~% tar xzvf qdbm-1.8.77.tar.gz [travail@mina]~% cd qdbm-1.8.77 [travail@mina]~% ./configure --prefix=/usr/local --enable-zlib [travail@mina]~% make [travail@mina]~% make check [travail@mina]~% sudo make install
QDBM もスッコーンと入ってしまうので最後に Hyper Estraier。
[travail@mina]~% wget http://hyperestraier.sourceforge.net/hyperestraier-1.4.13.tar.gz [travail@mina]~% tar xzvf hyperestraier-1.4.13.tar.gz [travail@mina]~% cd hyperestraier-1.4.13 [travail@mina]~% ./configure --prefix=/usr/local [travail@mina]~% make [travail@mina]~% make check [travail@mina]~% sudo make install
Hyper Estraier もサクッと入ってインストールは完了。
インデックスの作成
インデックスの作成自体は簡単で、Hyper Estraier のページから引用すると
あなたがWebサイトを運営していて、そのコンテンツが「/home/www/public_html」以下に置いてあるとしましょう。その下にある全てのHTMLファイルを登録したインデックスを「/home/www/casket」として作成することにします。それには、以下のコマンドを実行します。 cd /home/www estcmd gather -il ja -sd casket /home/www/public_html
らしいです。
ただ、これだとおもしろくないので MySQL のデータを引っ張ってきてインデックスを作成してみたいと思います。下記のサイトを参考にします。
インデックス作成用のスクリプトが書いてあるのでそれをいじって実行すればインデックスを作成することができます。今回は上記のHyper Estraier で検索に倣ってドラフト文書からインデックスを作成したいと思います。
ドラフト文書とは
@key1=value1 @key2=value2 @key3=value3 Here is TEXT PART
のような @key=value の形をした属性部が複数行並び、改行をひとつ入れてテキスト部が存在します。属性部とテキスト部は改行で区切られて文字コードは UTF-8 でなくてはなりません。
ドラフト文書からインデックスを作成するには estcmd put というコマンドを使用しますが、estcmd put の構文は
estcmd put [-tr] [-cl] [-ws] [-apn|-acc] [-xs|-xl|-xh|-xh2|-xh3] [-sv|-si|-sa] db [file]
となっていて、引数の [file] を省略すると estcmd put はプロンプトを返さずに標準入力を待ち受けます。もし標準入力からドラフト文書を入力するのであればこんな感じになります。
[travail@mina]~% /usr/local/bin/estcmd put -cl /tmp/casket/ [ Enter ] @uri=http://hibinokoto.jp/archive/2008/09/01/ [ Enter ] @title=なつやすみおわっちゃった [ Enter ] @cdate=2008-09-01T21:34:19 [ Enter ] [ Enter ] きのうでながかったなつやすみもおわっちゃった。 [ Enter ] ちょうしでんてつにのったり、けっこんしたり、たんじょうびプレゼントにかわぐつをもらったりした。[ Enter ] 9がつはかれのたんじょうびがあるのでプレゼントをかんがえなくちゃいけない。[ Enter ] ハルヒの DVD がほしいといっていなぁ・・・。[ Enter ] [ Ctrl + D ] /usr/local/bin/estcmd: INFO: status: name=/tmp/casket/ dnum=244 wnum=2735 fsiz=7269823 crnum=0 csiz=0 dknum=0 /usr/local/bin/estcmd: INFO: 245 (http://kokuban.in/view/1217480299): registered /usr/local/bin/estcmd: INFO: flushing index words: name=/tmp/casket/ dnum=244 wnum=2736 fsiz=7270053 crnum=0 csiz=0 dknum=19 /usr/local/bin/estcmd: INFO: cleaning dispensable keys: name=/tmp/casket/ dnum=244 wnum=2735 fsiz=7270053 crnum=0 csiz=0 dknum=18 /usr/local/bin/estcmd: INFO: closing: name=/tmp/casket/ dnum=244 wnum=2729 fsiz=7270053 crnum=0 csiz=0 dknum=0
スクリプトを回した方が100万倍らくちんですね。今回はHyper Estraier で検索のスクリプトをちょっと修正してインデックスを作成しました。
検索
さて、インデックスの作成が済んだら検索を行いたいところですがコマンドラインからの検索ではなく検索用のスクリプトを書いてみたいと思います。
google さんに聞いてみると CPAN の Search::Estraier か Hyper Estraier に同梱されている Estraier.pm のふたつが使えるようです。
Search::Estraier は Plugger でも採用されるモジュールになりますが LWP::UserAgent を使用しているのが気になります。
・LWP::UserAget で get をコールした時点でメモリが約2M太る
・YAML や JSON, XML でないデータを自前でパースしている
・node (インデックス置き場)をどこにする?
バッチのスクリプトで use Search::Estraier; してメモリが約2M太ったら痛いですよね。
って言うか、せっかく Hyper Estraier に Estraier.pm が同梱されているのだからそれを使いましょうよというお話ですよね。Perl のバージョンが 5.6.2 の環境では ExtUtils::typemap に 'const char *' のマッピングがないと怒られてインストールすることができませんでしたが、5.8.8 と 5.8.0 の環境ではインストールできました。下記のようになります。
[travail@mina]~% cd hyperestraier-1.4.13 [travail@mina]~% cd perlnative [travail@mina]~% ./configure [travail@mina]~% make [travail@mina]~% make check [travail@mina]~% sudo make install
これまたらくちんですね。続いて検索用のスクリプト。
searcher.pl
#!/usr/bin/perl
use strict;
use warnings;
use Estraier;
use Data::Dumper;
my $db = Database->new;
# read-mode
$db->open('/tmp/casket', Database::DBREADER) or die $!;
my $cond = Condition->new;
$cond->set_phrase('dvd');
# ORDER BY @uri ASC
$cond->set_order('@uri STRA');
# fetch document
my $result = $db->search($cond);
# the number of documents
my $dnum = $result->doc_num;
foreach my $num ((0..$dnum - 1)) {
# get @id
my $doc_id = $result->get_doc_id($num);
# retrieve document by @id
my $doc = $db->get_doc($doc_id, 0);
# get @uri
my $uri = $doc->attr('@uri')
# get @title
my $title = $doc->attr('@title')
warn Dumper($uri);
# http://hibinokoto.jp/archive/2008/09/01/
warn Dumper($title);
# なつやすみおわっちゃった
}
$db->close;
exit;
ドラフト文書のテキスト部に「dvd(DVD)」という単語を含む文書を @uri の昇順で検索するスクリプトです。このスクリプトで先ほどプロンプトから入力した文書が検索されるわけですが、検索条件の set_phrase() に 'DVD' でなく 'dvd' を指定しています。Hyper Estraier では大文字と小文字を区別しないそうです。
set_phrase() に 'cd AND dvd' と指定すると「cd(CD)」と「dvd(DVD)」を両方含む文書が検索されます。'OR' を指定すれば 「cd(CD)」か「dvd(DVD)」を含む文書が検索されます。'AND' と 'OR' は演算子なので大文字にしなければなりません。
じゃあ、「and」と「or」を含む文書はどう検索するの?ということですが、それは 'and AND or' のようにしてくださいとのことです。演算子は大文字でってことですね。
@uri や @title などの属性に検索をかけることもできますが Perl バインディングの詳しい API は作者の平林さんちの幹夫くんのページで。
- Newer: 9月20日の音楽のこと
- Older: 結婚したものの
Comments:4
- gggami 2008年9月12日 02:04
前に使ったときに、速度でちょっと悩みました。
件数はそれほど多くないのだけれど、
属性での検索やソートをしすぎたようで。そのときは、インデックスを作るときに
属性へのインデックス(SQL的な)を作れたり
そもそものソート順をスコアではなく任意の属性の昇順・降順に
できたりしたので、それを使ってなんとなくがんばった気がします。なんて、業界の中の人になったつもりで
書いてみました。えへ。- ちわ 2008年9月12日 11:01
> gggami さん
相も変わらず検索してるんですね。
どれくらいの速度だったのかが気になります。
僕は 100,000件データを入れてテキスト部への検索をすると
0.00006秒くらいで結果が返ってきます。- gggami 2008年9月13日 01:06
Estraier の入りと出は見てなかったんですけど、
modperl の Handler (で合ってる?)でAPIにして
そいつをよんで戻りの XML をパースしおわったところで
1秒前後でしたね。
1回のコールで
30万件と5000件ぐらいの二つのインデックスを
検索してましたね。
で、結局30万件のほうをキャリアごとに分けましたね。
テキストの量がひどくすくなかったので
あれは DB を使った方がよかったんだと思います。
検索しかしてませんよ、ほんとw- ちわ 2008年9月17日 12:03
> gggami さん
あぁ、確かに属性検索すると重いわ。
-ord が重い。
Trackbacks:0
- TrackBack URL for this entry
- http://hibinokoto.jp/mt/mt-tb.cgi/292
- Listed below are links to weblogs that reference
- Hyper Estraier と Estraier.pm をインストール from 日々のこと