- ベストアンサー
pdfの検索にnamazuなどを使うメリットとは?
- Linux(debian wheezy)であるディレクトリにあるpdfファイル群の中身のテキストを検索する方法として、findコマンドとnamazu、groongaを比較してメリットを検討する。
- 検索する方法は他にも存在するが、pdfをtxt化する必要があり、その際にファイル名の空白を削除する処理も必要となる。
- また、namazuを文字化けせず利用するためにはロケールをEUC-JPに変更する必要があり、これによって後々面倒なことが発生する可能性もある。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
・grep対象のテキストファイルの文字コードが統一されていて(異なるのはnkf等で事前に統一) ・grepで指定する文字列の文字コードもそれと同じで ・ファイル数やファイルサイズも少なくて ・PDFが更新されるたびにテキスト化する手間が惜しくなく(ないしは、アップロード時に変換を自動化しておくか) ・検索結果の一覧やそのリンクのHTML化するのも自力で行う(ないしは、HTML化は不要) ってことならgrepでも いいんじゃないですかね。 逆にいうと、同一ファイルに対して何度も検索をしていて、 その対象となるデータ量が多いとか、今後増える予定ってことなら、 grep検索では実用的な応答速度にならないかもしれませんので、 その場合は、全文検索エンジンを使うべきかと。 なお、mknmzで PDFファイルが Unable to convert pdf file (maybe copying protection) のエラーになる件は、 実際にPDFにパスワードロックがかかっているのでなく デフォルトロケールをEUC-JPにすると解決するということなら、 xpfdの設定ファイル(xpdfrc)のunicodeMapで指定しているファイルがないってことかも。 (パス間違いとかで・・)
その他の回答 (3)
- superside0
- ベストアンサー率64% (461/711)
> namazu のインデックス作成は >一つのファイルのみを書き換えた時でも >全ファイルをスキャンしなおす、 >という面倒なやり方になっているのも少し気になります。 そんなことはありません。 インデックス済のファイルは、更新されない限りは再度インデックス化されることはありません。 もしかして、元ファイルが更新されていなくても、 テンポラリファイルを毎回作り直して そのテンポラリファイルをインデックス化しているのではないですか? その場合、テンポラリファイルを生成するシェル側として、 元ファイルが更新したものだけ、テンポラリファイルを作り直すようにすれば解決する問題です。 (findの -newer など使って) > (HTML化するとどういうメリットがあるかが分からないのですが・・・) ヒットしたファイルの一覧や ヒットした前後の文章や そのファイルへのリンクが HTMLで生成してあれば視認性が高まりますし、該当ファイルの閲覧のナビゲーションが簡単にできます。 もちろん、検索結果をどう使うのかの 用途次第ですが。
お礼
ありがとうございます。 コメントが遅くなり申し訳ありません。 > そんなことはありません。 > インデックス済のファイルは、更新されない限りは再度インデックス化されることはありません。 ネットで見つけた とあるプレゼン用のpdfファイルに 私が書いたように書いてあったのですが、 実際に自分のシステムで確かめてみましたが そのpdfに書いてあったことは間違いだったようです。 テンポラリファイル (pdftotextが生成するtxtファイルのことでしょうか) を毎回作り直すということはやっていませんが、 既にあるpdfを更新する時は ファイル名を少し変えることによって対応させようと思っておりました。 自作スクリプトはこれからまたいじってみます。 スクリプトによる処理は Google で検索すると難しいやり方でやっているものが多いようです。 なぜ自分がやろうとしている単純なやり方でやらないのかが 多少不思議ではあります。
- oshiete_poo_V1
- ベストアンサー率42% (15/35)
質問に対する回答はNo1のおっしゃっている通りと思いますが、 これではNamazuがあまりにも不憫な気がします。 > Namazu を文字化けせず使うためには $ sudo update-locale … sudoしなければならないような特権は必要ありません 適切に運用すれば文字化けしません > どのやり方でもまずpdf を txt化しておかねばなりません。 ドキュメントの通りにすればpdfからindexを生成することができます。 > ファイル名からやっかいな空白 スペースがあるファイルもちゃんとNamazuで検索できます。 一方、デメリットの追加: ・Namazuで検索する(インデックスを構築する)のとgrepでは結果が異なる可能性があります。 ・groongaの方は運用次第でインデックス構築方法を変更できる。 原因についてはgroongaのマニュアルに(理解できるかどうかはさておき)書いてありますが、ここでは結果が異なる可能性があると言う事実だけ知っておけば十分でしょう。
お礼
ありがとうございます。 > > Namazu を文字化けせず使うためには $ sudo update-locale … > sudoしなければならないような特権は必要ありません > 適切に運用すれば文字化けしません これは私の環境に起因する問題なのでしょうか。 $ sudo update-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja" $ update-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja" bash: update-locale: コマンドが見つかりません となって、UTF-8 をロケールに設定している状態では次のようになります。 $ mknmz -c ../s1 �����оݤΥե�������Ĵ�٤Ƥ��ޤ�... 1�ĤΥե����뤬�����ǥå����������оݤȤ��Ƹ��Ĥ����ޤ��� 1/1 - /home/ykok/Desktop/nmz/database-dir/../s1/Namazu.pdf Unable to convert pdf file (maybe copying protection) [����] ����: Mon Dec 15 08:53:46 2014 �狼������: /usr/bin/chasen -i e -j -F "%m " �����ƥ�: linux Perl: 5.014002 Namazu: 2.0.21 $ mknmz -b ../s1 �����оݤΥե�������Ĵ�٤Ƥ��ޤ�... 1�ĤΥե����뤬�����ǥå����������оݤȤ��Ƹ��Ĥ����ޤ��� 1/1 - /home/ykok/Desktop/nmz/database-dir/../s1/Namazu.pdf Unable to convert pdf file (maybe copying protection) [����] ����: Mon Dec 15 08:57:07 2014 �狼������: no �����ƥ�: linux Perl: 5.014002 Namazu: 2.0.21 $ mknmz -k ../s1 Can't locate Text/Kakasi.pm in @INC (@INC contains: /usr/sha re/namazu/filter /usr/share/namazu/pl . /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl) at /usr/bin/mknmz line 956. $ mknmz -m ../s1 �����оݤΥե�������Ĵ�٤Ƥ��ޤ�... 1�ĤΥե����뤬�����ǥå����������оݤȤ��Ƹ��Ĥ����ޤ��� 1/1 - /home/ykok/Desktop/nmz/database-dir/../s1/Namazu.pdf Unable to convert pdf file (maybe copying protection) [����] ����: Mon Dec 15 08:58:10 2014 �狼������: /usr/bin/chasen -i e -j -F "%m %H\n" �����ƥ�: linux Perl: 5.014002 Namazu: 2.0.21 > > どのやり方でもまずpdf を txt化しておかねばなりません。 > ドキュメントの通りにすればpdfからindexを生成することができます。 下記のようになったので pdf を txt化しておかねばならないと思ったのですが、 もう少し http://www.namazu.org/doc/manual.html などを読み込んでみます。 $ ls -l ../s1 合計 360 -rwxrwxrwx 1 ykok ykok 363259 12月 15 08:34 N amazu.pdf $ mknmz -c ../s1 検索対象のファイルを調べています... 1個のファイルがインデックス作成の対象として見つかりました 1/1 - /home/ykok/Desktop/nmz/database-dir/../s1/N%20amazu.pdf Unable to convert pdf file (maybe copying protection) [基本] 日付: Mon Dec 15 09:22:24 2014 わかち書き: /usr/bin/chasen -i e -j -F "%m " システム: linux Perl: 5.014002 Namazu: 2.0.21
補足
$ namazu -v namazu of Namazu 2.0.21 Copyright (C) 1997-1999 Satoru Takabayashi All rights reserved. Copyright (C) 2000-2011 Namazu Project All rights reserved. This is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
namazu groonga を使用するメリットは『事前にイン デックスを作っておけば、検索速度がめっちゃ速い』 ことです。 もし、処理手順を 1. 検索を開始 2. pdf からテキストを抽出 3. 抽出したテキストから検索実行 4. 結果表示 のようなことを考えているのであれば、namazu groonga を使うのはデメリットしかありません。 (検索のためにインデックスを作る処理に時間が かかるので、逆に遅くなってしまう) namazu groonga を効率的に使えるのは ・事前にインデックスを作ることができる ・事前に作ったインデックスを使いまわして 検索するケースが多い 場合です。 検索のたびに pdf が変わる前提のシステムなら使う メリットは皆無です。
お礼
ありがとうございます。 検索するディレクトリの pdf は少しづつ追加されていき そのたびにインデックスを作成しなおしておく、 というようにして使用していくことになると思います。 > 2. pdf からテキストを抽出 No.2 の方によると、namazu ではこれは必要ないということのようですね。
お礼
ありがとうございます。 ファイル数やファイルサイズは そんなに大きくはならない範囲で使っていくことになると思います。 それと、検索語句がどのファイルに含まれているかが分かれば十分ですので、 HTML化したいとは考えておりません。 (HTML化するとどういうメリットがあるかが分からないのですが・・・) namazu のインデックス作成は 一つのファイルのみを書き換えた時でも 全ファイルをスキャンしなおす、 という面倒なやり方になっているのも少し気になります。 groonga は debian の安定版ではまだ使えないので私は試せない状況ですが、 こちらはどうでしょう? > xpfdの設定ファイル(xpdfrc)のunicodeMapで指定しているファイルがないってことかも。 > (パス間違いとかで・・) xpdf はインストールしていなかったので、 poppler を探してみましたが、どれが設定ファイルか分かりません。 $ sudo find / -name '*poppler*' /var/lib/dpkg/info/poppler-utils.list (中略) /var/lib/dpkg/info/libpoppler-glib8:amd64.md5sums /usr/share/doc/libpoppler19 /usr/share/doc/poppler-data /usr/share/doc/libpoppler-glib8 /usr/share/doc/poppler-utils /usr/share/poppler /usr/lib/x86_64-linux-gnu/libpoppler-glib.so.8 /usr/lib/x86_64-linux-gnu/tumbler-1/plugins/tumbler-poppler-thumbnailer.so /usr/lib/x86_64-linux-gnu/libpoppler.so.19.0.0 /usr/lib/x86_64-linux-gnu/libpoppler-glib.so.8.2.0 /usr/lib/x86_64-linux-gnu/libpoppler.so.19 [1]+ 終了 xpdf xpdf もインストールしてみたのですが $ find /usr -name '*xpdfrc*' /usr/share/xpdf/xpdfrc-greek /usr/share/xpdf/xpdfrc-turkish /usr/share/xpdf/xpdfrc-chinese-simplified /usr/share/xpdf/xpdfrc-arabic /usr/share/xpdf/xpdfrc-hebrew /usr/share/xpdf/xpdfrc-latin2 /usr/share/xpdf/xpdfrc-korean /usr/share/xpdf/xpdfrc-thai /usr/share/xpdf/xpdfrc-japanese /usr/share/xpdf/xpdfrc-chinese-traditional /usr/share/xpdf/xpdfrc-cyrillic /usr/share/man/man5/xpdfrc.5.gz $ cat /usr/share/xpdf/xpdfrc-japanese | grep unicodeMap unicodeMap ISO-2022-JP /usr/share/poppler/unicodeMap/ISO-2022-JP unicodeMap EUC-JP /usr/share/poppler/unicodeMap/EUC-JP unicodeMap Shift-JIS /usr/share/poppler/unicodeMap/Shift-JIS となっていまして、utf-8 は全くありません。 PDFテキスト化のための 自作のスクリプト pdf_trf.sh を走らせたたのですが、 エラーが出ております。 $ cat ~/Desktop/pdf_trf.sh find ./ -name '*.pdf' | while read line;do # find ./ -name '*.pdf'-print | while read line;do if [ -e ${line%.pdf}.txt ] then echo ${line},'skip' else pdftotext ${line} ${line%.pdf}.txt fi done $ bash ~/Desktop/pdf_trf.sh /home/ykok/Desktop/pdf_trf.sh: 3 行: [: ./01: 二項演算子が予期されます pdftotext version 0.18.4 Copyright 2005-2011 The Poppler Developers - http://poppler.freedesktop.org Copyright 1996-2004 Glyph & Cog, LLC Usage: pdftotext [options] <PDF-file> [<text-file>] -f <int> : first page to convert (以下略)