knowledgeTreeで日本語全文検索(みたいなこと)

knowledgeTreeという文書管理システムがある。Webブラウザを使って、WordやらExcelやらPowerPointやらPDFやらのファイルをサーバ側で一括管理しちゃおう、という代物である。有償製品版とオープンソース版とがあって、オープンソース版は無料で入手できる。

ユーザインターフェースは英語だけど*1内部処理はUTF-8で統一されているので、ファイル名が日本語であっても、ファイルの中身が日本語であっても、問題なくファイルの管理は可能。

ただしknowledgeTreeの売り文句の一つである全文検索は日本語ファイルでは活用できない。knowledgeTreeが全文検索エンジンとして使っているMySQLが日本語全文検索に対応できていないためだ。

そこをなんとかしよう、という試みの第一歩に成功したので記録しておく。

前提

自分が使ってる環境。他のLinux Distributionの人はそれなりに考えてちょ。Windowsな人は...知らない(笑)。

方式

knowledgeTreeは文書をデータベースに書き込む前に、Indexerというプラグインで文書からテキスト情報を抽出し、MySQLのdocument_searchable_textに格納する。そのIndexer処理にmecabの「わかち書き」を食わせて、日本語文書もMySQLのmatch...against文に対応できるようにする。

IndexerはknowledgeTreeをインストールした先の plugins/ktstandard/contents の下にある。Indexerは外部プログラムへのWrapperであり、標準ではcatdoc (for Word)、 catppt (for PowerPoint)、 pdf2text (for PDF)などが config/config.ini で指定されている。

ということで、catdocやcatpptの出力をmecabにパイプ渡しするシェルスクリプトを作り、そのシェルスクリプトをconfig.iniで指定してやれば、document_searchable_textに「わかち書き」された日本語テキストが格納される...はずである。

Word

WordIndexer.phpおよびlib/util/ktutil.incを追っていくと、Indexerは

catdoc -w -d UTF-8 元のファイル >> 処理後のファイル

というコマンドを実行することがわかる。そこで/usr/local/bin/mycatdocを

#! /bin/sh
/usr/bin/catdoc -w -d UTF8 $4|/usr/bin/mecab -O wakati

として作成し、config.iniの中で

catdoc = /usr/local/bin/mycatdoc

と指定すれば、日本語Word文書の中身がわかち書きされてデータベースに登録される。

PowerPoint

Wordと同様だが、こちらはcatpptというコマンドを使う。引数とかが微妙に異る。

#! /bin/sh
/usr/bin/catppt "$1"|/usr/bin/mecab -O wakati

みたいに/usr/local/bin/mycatpptを作成し、config.iniにて

catppt = /usr/local/bin/mycatppt

とする。ただ、このままでは文字化けするので plugins/ktstandard/contents/PowerPointIndexer.php の中に以下のメソッドを追加する必要がある。

function extract_contents($sFilename, $sTempFilename) {
putenv('LANG=en_US.UTF-8');
return parent::extract_contents($sFilename, $sTempFilename);
}

PDF

popplerについてくるpdftotextを使う。
/usr/local/bin/mypdftotext

#! /bin/sh
/usr/bin/pdftotext -nopgbrk -enc UTF-8 "$4" -|/usr/bin/mecab -O wakati > "$5"

config.iniの中は

pdftotext = /usr/local/bin/mypdftotext

MySQL側チューニング

MySQL全文検索は、いわゆるゴミ単語を検索しないようにデフォルトでは3文字以下の単語を無視するようになっている。このままでは日本語の二文字熟語を検索できない。MySQLのマニュアルを見て、2文字以上なら検索できるようにする。

制約事項

今回の作業は、あくまでも日本語文書を「わかち書き」にしただけ。例えば「はてなダイアリー」という単語は「はてな」と「ダイアリー」に分割されて格納される。なので、「はてなダイアリー」で検索してもヒットしない。検索語もわかち書き処理する必要があるが、それにはknowledgeTree側にそれなりに手を入れる必要があろう。

また、Excel、Postscript、OpenDocumentについては今回対象外とした。

  • Excelのテキストを抽出するxsl2csvの日本語対応がイマイチ
  • PostScriptは手元に標本がないのでパス
  • 現時点でのOpenDocument用Indexerは「やっつけ仕事」っぽく、外部コマンドの切り出しができてない

まとめ

*1:日本語UIを開発している人もいる

*2:あるいは、自前ebuildを作るか