namazuで作る、PDF、Word、Excel全文検索システム 第3回(最終回)
前回でPDF,Word,Excelの検索ができるようになりました。
しかし、ここで一つ問題があります。
namazuはデフォルトeuc-jpで、UTF-8を認識してくれないということです。
この問題と、以下の文字コード設定との関係性によっては、文字化けが起こる可能性があります。
・サーバの文字コード
・ファイルの文字コード
・ファイル名、ディレクトリ名の文字コード
また、次の設定によっては文字化けして表示されます。
・シェルコマンド画面の文字コード(namazu.cgiを使わない場合)
・ブラウザの文字コード(namazu.cgiを使う場合)
幾つかのパターンで文字化けを改善する方法を見ていきましょう。
まず、namazu.cgiを使うかどうか(ブラウザで検索を行うかどうか)によって変わってきます。
1.文字化け対応:namazu.cgiを使わない場合
namazu.cgiを使わない、つまりシェルコマンドライン上でmknmz,namazuコマンドを実行するだけであれば、
それほどややこしくありません。
・サーバの文字コードがeuc-jpの場合(ファイル名、ディレクトリ名もeuc-jpになっている)
⇒シェルコマンド画面の文字コードをeucにしてmknmzを実行。
⇒namazuコマンドで検索する
・サーバの文字コードがutf-8の場合(ファイル名、ディレクトリ名もutf-8になっている)
⇒シェルコマンド画面の文字コードをutf-8にしてmknmzを実行。
⇒検索文字列を引数で渡すようなシェルスクリプトを組む。
スクリプト内ではnkfコマンドを用いて引数をeuc-jpに変換してから、namazuコマンドを実行する。
#!/bin/bash euc=`printf $1 | nkf -e` /usr/local/bin/namazu $euc /usr/local/var/namazu/index/XXXX/ -s
2.文字化け対応:namazu.cgiを使う場合
・サーバの文字コードがeuc-jpの場合(ファイル名、ディレクトリ名もeuc-jpになっている)
⇒NMZ.head.jaでmetaタグにcharset=”euc-jp”を指定してあげる。
⇒ブラウザの文字コードeuc-jpでnamazu.cgiを見ればOK。
・サーバの文字コードがutf-8の場合(ファイル名、ディレクトリ名もutf-8になっている)
この場合は少し厄介です。
⇒検索対象ディレクトリ以下をまるっとeuc-jpに変換(もしくはコピーしてからeuc-jpに変換。検索対象はコピー先とする)
※convmvコマンドを使います。
$CP_DIR=/home/namazu/XXXXX /usr/bin/convmv --notest -r -f utf-8 -t euc-jp $CP_DIR
⇒シェルコマンド画面の文字コードをeuc-jpにしてmknmzを実行。
⇒NMZ.head.jaでmetaタグにcharset=”euc-jp”を指定してあげる。
⇒ブラウザの文字コードeuc-jpでnamazu.cgiを見ればOK。
この場合、生成インデックスと表示画面をまるっとeuc-jpにすることで対応できるかと思いましたが、
インデックスをeuc-jpに変換するだけでは検索機能が機能しないようでした。
そこで検索対象をまるっとeuc-jpに変換するという手法をとりました。
3.補足:どんな時に使うの?
本記事の内容はドキュメントルート以下の半角英数字のみのURLを表示するだけの検索機能であれば、問題にはなりません。
Webページ以外のドキュメント類の検索(全角文字がパス内に存在する)時に問題となる事象でしょう。
サーバ文字コードとしてutf-8を指定されていることが多いと思います。
NFSなどを用いてWindows上の全角文字を使用したディレクトリやファイルをlinuxサーバで管理し、
その環境でnamazuを利用したドキュメント検索を行いたいような場合に、文字化け問題が発生するでしょう。
4.補足:クーロンで実行する場合の注意点
クーロンで実行する場合、注意しなければならない点が1点。
PATHとLANGのexportをしておく必要があるということ。ここでも地味にはまりました。
PATH=~~~~~ export $PATH LANG=~~~~~ export $LANG
PATHはまぁわかるのですが、LANGは見落としがちかもしれません。
mknmzコマンド自体は動くのですが、インデックスされる検索ワードが極端に少なくなります。
5.まとめ
3回にわたり、namazuのドキュメント検索についてみてきました。
namazuの文字コード問題が最もはまったところでしたが、なんとか対応ができました。
記事にまとめたところ以外も併せて、全体的に扱いずらいと感じた部分をまとめると、
1.namazu.cgiがバイナリなので、設定ファイルを編集することでしか対応できないところ
2.デザインもテンプレートファイル以外の部分での出力が見えないため、カスタマイズに限りがあるところ
3.文字コードがutf-8に対応していないところ
4.kakasiを用いた場合、ロンゲストマッチになるところ。
あたりでしょうか。
今回は主に3の対応の話をまとめました。
2に関してはコマンドラインで出力した出力結果を基に、正規表現を使いながら独自でスクリプトを組み直すことで対応可能でしょう。
4に関してはchasenなど、他の形態素解析ソフトを使うこともできるようなので、それで改善するかもしれません。
このように扱いずらい部分も多々ありますが、一度構築してしまえば便利なシステムです。
根気よく設定をかえつつ、色々試してみてください。