unshiu

最近の更新履歴

全文検索エンジン


unshiuでは全文検索エンジンとして Hyper Estraier を採用しています。以下Hyper Estraierに関する詳細と利用状況をまとめます。


概要

基本的には N-gram方式を利用します。形態素解析は要望があれば別途考えるが本線としては考えない。

利用上の注意

Hyper Estraierは仕組み上、インデックスをDBとは別に作成し、高速な検索を可能にしています。よってHyper Estraierのインデックス容量を想定しておく必要があります。また1台で処理できる(パフォーマンスの面で)インデックスの最大サイズは約300GB程度であり、それ以上のサイズになった場合は複数台でクラスタリングさせ内部でP2P方式でデータを交換する方式が用意されています。この場合、処理可能なデータ数は増えますが、内部のネットワーク負荷が増大することを想定してください。

インストール

Windows

http://hyperestraier.sourceforge.net/win/

最新をダウンロードし、展開してそのディレクトリにPATHを通します。

Linux

関連ライブラリをインストール

libiconv インストール

$ cd /usr/local/src/
$ wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.12.tar.gz
$ tar xvzf libiconv-1.12.tar.gz
$ cd libiconv-1.12
$ ./configure
$ make
$ make install

zlib インストール

$ wget http://www.zlib.net/zlib-1.2.3.tar.gz
$ tar zxvf zlib-1.2.3.tar.gz
$ cd zlib-1.2.3
$ ./configure
$ make
$ make install

qdbm インストール

$ wget http://qdbm.sourceforge.net/qdbm-1.8.77.tar.gz
$ tar zxvf qdbm-1.8.77.tar.gz
$ cd qdbm-1.8.77
$ ./configure --enable-zlib --enable-pthread
$ make
$ make check
$ make install


環境によっては make check 時に以下のようなエラーがでます。この場合、インストールは成功したようにみえますが、Hyper Estraierをインストールし、起動しようとしてもエラーがでて終了してしまいます。

$ make check
$ Checking memory allocation ... ok
$ Checking basic datum ... ./cbtest: symbol lookup error: ./cbtest: undefined symbol: cbdatumprintf make: *** [check] Error 127

[原因と対処方法]

/usr/libに古いバージョンのlibqdbmが入っていると発生します。削除してmake install してください。

Hyper Estraier インストール

$ wget http://hyperestraier.sourceforge.net/hyperestraier-1.4.13.tar.gz
$ tar zxvf hyperestraier-1.4.13.tar.gz
$ cd hyperestraier-1.4.13
$ ./configure
$ make
$ make install

Mac

portを利用している前提です。

$ sudo port install hyperestraier

初期化

estmaster init casket

casket という名前でディレクトリがカレントに作られます。 casket という名前はアルファベットであれば特に制限はありません。

キャッシュ反映時間を設定

テスト用に作成した場合のみキャッシュによるテスト失敗を防ぐために以下の設定をしてください。

cd casket
vi _conf

cachesize: 0
cachernum: 0


これによりキャッシュの反映時間が0になります。なお本番サーバではパフォーマンスを考慮しこの設定のでの運用はしないでください。
サーバー起動

$ estmaster start casket

以下のように-bgをstartの次につけるとバックグランドで立ちあがります。

$ estmaster start -bg casket

マスタ管理

以下のURLへアクセスしてください。
管理用のIDとパスワードをきかれるので admin/admin (デフォルト)でログインできます。

http://localhost:1978/master_ui

ノード作成

Manage Nodes を選択し、フォームに以下を順に入力して「create」を押してノードを作成します。

「nodename」「ノード説明」

nodename はあとで Rails から指定する名前です。
実行環境毎に作るのでローカルならとりあえず「development」「test」あたりを作っておきましょう。

ユーザー作成

ローカル環境ならスキップしても問題ありません。
ただし本番環境ではセキュリティを考慮し必ず admin ユーザを消して別の名前で作成しましょう。

Manage Users を選択し、フォームに以下を順に入力して「create」を押してノードを作成します。
3つめの「s」は管理者を意味するようです。

「username」「password」「s」

サーバー終了方法

$ estmaster stop casket

killやサーバダウンなどでstop処理以外で終了された場合、以下のファイルを消さないと起動しません。
またこれを消して起動しても、インデックスが壊れている場合は正常に検索することはできません。

casket/_pid

インデックスの作成

インデックスが壊れたり、一度導入した後に利用を考える場合にはDB情報を元にインデックスの再作成が別途必要になります。
方法

ruby script/console
>> DiaEntry.reindex!


インデックスされたデータをけしたのにインデックスの反映が行われていない場合は一旦クリアしてから再構成する必要があります。

ruby script/console
>> DiaEntry.clear_index!
>> DiaEntry.reindex!


注意点

インデックスの作成はCPUのリソースを大量に使い、かつデータ量に応じて作成時間がかかります。

利用する上での考慮点

全文検索対象とすることで以下の点を考慮してください。
  • インデックスが作成されるまで検索結果に現れないためレコードの更新とタイムラグがあります。
  • Hyper Estraierダウン時には検索結果が0件になります。(エラーにはならない)
  • データがインデックスから削除されても領域は利用されたままの扱いのため定期的に最適化が必要です(postgresのvacuumeみたいなもの)
  • 全文検索対象のレコードを直接SQLで更新した場合、インデックス側に反映されないので、絶対に行わないで下さい。

unshiuでの利用

以下の点を全文検索対象としています。

 plugin名 テーブル名 項目 補記
 dia dia_entries title 日記タイトル
   body 日記本文
 cmm cmm_communities name コミュニティ名
   profile コミュニティ説明