Hyper Estraier で PDF 管理

PDF データの索引化と検索

電子書籍や專門分野に関わる資料のみならず、最近では学術論文が PDF で配布されることも珍しくないので、HDD の中でどんどん肥大化していく PDF データを持て余しているのは私だけではないだろう。先日の記事「Hyper Estraier で仏典探索」で、試みに全文検索システム Hyper Estraier を用いてローカルに保存されているテキストファイルを検索してみたが、この全文検索システム は PDF 文書の検索にも対応しているので、その検索も任せてみる。なお、以下は 前回 に引き続き Mac OS X 10.6.8 上で、 Macports を用いて Hyper Estraier をインストール (/opt/local/bin/estcmd) した上で作業を行っている。

Hyper Estraier で PDF を扱う場合、PDF を HTML 形式に変換するフィルタ estfxpdftohtml が用いられるが、先日も書いたように、フィルタのスクリプトはそのままではパスの通ったところにインストールされていないので (Macports でインストールした場合 /opt/local/share/doc/hyperestraier/filter/ 以下に置かれる) 適当な場所にコピーしておく。なお、estfxpdftohtml を動作させるには pdftotext (xpdf に同梱) をインストールしておくことが必要である。

今回も Apache を有効にした上で、Hyper Estraier に同梱されている検索用 CGI スクリプトを利用してみる。

$ mkdir -p /Library/WebServer/Documents/pdf
$ cd /Library/WebServer/Documents/pdf
$ ln -s /Library/PDFs .   # <-- symbolic link to PDF data directory
$ estcmd create casket    # <-- casket = coffin in which "corpse" ("corpus") is kept
$ estcmd gather -pc UTF-8 -cl -fx ".pdf" "H@estfxpdftohtml" -il ja -lf -1 -sd -cm -um casket PDFs
 ...
estcmd: INFO: finished successfully: elapsed time: 1h 6m 44s

私は普段 /Libary/PDFs/ 以下に PDF ドキュメントを保存しているので1、上のように /Library/WebServer/Documents/pdf//Libary/PDFs/ へのシンボリックリンクを作成しておいた。後は前回と同じように estcmd を実行するが、たくさんのオプションがあるので詳しくは Hyper Estraier ユーザーガイド を参照のこと。今回使用した -fx オプションは外部コマンドを指定するもので、コマンド名の前に「T@」をつけるとその出力がプレーンテキストとして、「H@」をつけるとHTMLとして、「M@」をつけるとMIMEとして、いずれでもない場合は文書ドラフトとして解析される。このオプションは複数回指定可能で “-fx sufs cmd” というように使用する。今回はフィルタを介したことに加え、ディレクトリ /Library/PDFs は 125.83 GB あったので、インデックス作成に一時間強の時間がかかった。

estseek.cgi が動作するには設定ファイル (estseek.conf)・テンプレートファイル (estseek.tmpl) ・トップページファイル (estseek.top) ・ヘルプファイル (estseek.help) が必要なので、これも前回同様適宜コピーしておく。今回はそれぞれ pdf.cgi・pdf.conf・pdf.tmpl・pdf.top・estseek.help (help は前回と共通) という名前で保存した。

PDF データの索引を作成する際に内部で利用しているのは pdftotext なので、暗号化されたデータやグラフィックデータなどは索引化されない。このようなデータが多い場合は、内容検索よりもむしろファイル名検索の方が好ましい。ファイル名にその文書のキーワードを含めている方も多いだろう。その場合、設定ファイル (pdf.conf) でファイルサーバ用の入力フォームの形式 (formtype: file) を選択しておく。

Firefox (3.6.18) で http://localhost/cgi-bin/est/pdf.cgi にアクセスしてみる。

https://skalldan.files.wordpress.com/2011/07/wpid-est_pdf1.png

今回は formtype に “file” を選択したので次のように target に “body text” か “file path” かを選択できるようになっている。

https://skalldan.files.wordpress.com/2011/07/wpid-est_pdf21.png

file path 検索で、例えば “buddha” を検索してみると、

https://skalldan.files.wordpress.com/2011/07/wpid-est_pdf31.png

ファイル名に “buddha” が含まれる PDF ファイルの検索結果が並ぶ。目的の文書が見つかるとそのままブラウザ上で閲覧できる2

https://skalldan.files.wordpress.com/2011/07/wpid-est_pdf41.png

検索フォームの設置

Web サイトに検索フォームを設置する場合は次のように書く。

<form method="get" action="estseek.cgi">
<div>
<input type="text" name="phrase" value="" size="32" />
<input type="submit" value="Search" />
<input type="hidden" name="enc" value="UTF-8" />
</div>
</form>

上の検索フォーム用の HTML を /Library/WebServer/Documents/index.html に挿入して実験してみる。ブラウザで http://localhost/ にアクセスする。

https://skalldan.files.wordpress.com/2011/07/wpid-est_pdf51.png

PDF Document Search” が今回作成したもの、”Buddhological Text Search” は 前回 作成したもの、”Indological Text Search” はまだ作成していないが機会があれば作ってみる。”Man Page Search” は Bwana の検索フォーム3… とこのように各種検索に飛べるページを作成しておけば便利かもしれない。私はまだ実際にこうした使い方はしていないが、今回はひとまず Hyper Estraier の検索フォームの設置例としてメモしておく4

インデックス更新の自動化

頻繁にファイルを追加するならば cron で自動化しておけば楽ができる。

$ emacsclient /Library/WebServer/Documents/pdf/cron-pdf
Waiting for Emacs...

#!/bin/sh
estcomd gather -pc UTF-8 -cl -fx ".pdf" "H@estfxpdftohtml" -il ja -lf -1 -sd -cm -um /Library/WebServer/Documents/pdf/casket /Library/WebServer/Documents/pdf/PDFs
estcmd optimize /Library/WebServer/Documents/pdf/casket
estcmd purge -cl /Library/WebServer/Documents/pdf/casket
growlnotify --image /Library/WebServer/Documents/pdf/pdf.png -t "超迷子的報告" -m "PDF data's casket was successfully updated."

$ chmod +x /Library/WebServer/Documents/pdf/cron-pdf
$ crontab -e
Waiting for Emacs...

00 00 * * * /Library/WebServer/Documents/pdf/cron-pdf     # <-- added

crontab: installing new crontab
$ /Library/WebServer/Documents/pdf/cron-pdf   # for test

上のように growlnotify を加えると実行後通知してくれる。詳しい使い方は こちら を参照。

https://skalldan.files.wordpress.com/2011/07/wpid-est_pdf63.png

まとめ

Hyper Estraier でいくつか検索を試してみたが、いわずもがな非常にすぐれた全文検索システムで、導入の敷居もそれほどは高くはなく (とくにインストールは port コマンドだけ)、かつ無償で利用出来る (ライセンス GNU LGPL)。名称の “Estraier” はそもそもが読み方が難しく作者自身は「エストレイア」と読んでいるらしいが、正式な発音は作者自身も不明らしい。意味は古いフランス語で「迷う」や「はぐれる」ということらしいが、手持ちのフランス語の辞書にも載っていないし、Wikipédia Français にも出ていないし、Google の検索設定で優先言語をフランス語にしてもヒットするのはこの検索システムの “Estraier” ばかりだ。そもそもどうして検索システムに「迷う」なのか。「超迷」ってしまっては捜し物は見つからない (Web Page のタイトル「超弩級迷子: コードだけでOSSの世界が回ると思ってんのか?」, estseek.cgi の default のタイトル「超迷子: 共同体的全文検索系」, Wikipedia 検索のデモサイト のタイトル「超弩級 Wikipedia 検索 ちょっぴり早い大人の検索システム」)。また、Hyper Estaier のインデックス作成時の例に出てくる “casket” の意味が分からず、前回は本家を含む Web 上の各所の説明に出てくるこのフォルダ名に倣わなかったが、これも作者のエスプリのきいた (?!) ネーミングだった。「棺桶・小箱」(casket) の意味するところは、「死体 (corpse, kɔ́ːps) を入れる箱」と「文例集 (corpus, kɔ́ːrpəs) を入れる箱」を掛けている、ということらしい (cf. FAQ)。「超迷子」が頼る道案内 (index) が「死体の入ったひつぎ」とは、なんとも作者の頭の中はディープな世界だ。

【追記 2011/07/09】 “estraier” は Godefroy の古典フランス語辞典 によると、現代フランス語では “errer ça et la” (あちこちさまよう), “sans maître” (主なき) といった意味。

Footnotes:

1 もう少し正確に書いておくと、/Library/PDFs もまた「もう一つの」内蔵 HDD へのリンクである。というのも少し前に遅ればせながら内蔵 HDD を SSD に換装したのだが (Crucial, RealSSD C300 256GB) 容量が少しだけ心もとなかったので MCE OptiBay Hard DriveKit を導入して思い切って光学ドライブを HDD に換装した (SEAGATE, 2.5inch SATA 750GB HDD)。iPad 2 を “Build To Order” で購入できるくらいの出費だったが、パフォーマンスははるかに向上した。この作業を行ったのがもう3ヶ月ほど前なのでほとんど忘れかけているが、この導入過程についても近いうちにブログの記事にしてメモしておこうと思う。… というような理由で、PDF など比較的容量を食うデータはすべて HDD 側 (Sthana: Sanskrit で “storage” の意味) に置いている。したがって OS の入っている SSD 側の /Library/PDFs は “Yet Another Buit-in HDD” の /Volumes/Sthana/Library/PDFs へのシンボリックリンクとなっている。

2 Firefox 上で PDF ファイルを閲覧するには PDF Plugin for firefox on Mac OS X を導入する。

3 Bwana とは通常は端末から見る man page をブラウザ上で見ることを可能とする Mac OS X のアプリケーション。ちなみに Bwana の検索フォームを設置したい場合次のように書く: <form method=”get” action=”man:”><input type=”text” name=”a” value=”” size=”32″><input type=”submit” value=”Search”></form>

4 スクリーンショットの「いかにも Mac らしい」(“très Mac”) ページスタイルは Mac OS X の Personal Web Site 用のテンプレート (~/Sites/index.html) からほとんどそのまま転用している。

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s