はじめに †
「Hyper Estraier」は,平林幹雄さんによって開発された全文検索システムです.
次の環境で確認しました.
- Mac OS X 10.6.1
- MeCab 0.98
- zlib 1.2.3
- QDBM 1.8.77
- Hyper Estraier 1.4.13
必要なもの †
- make
- gcc
- zlib
- QDBM
- MeCab
MeCabはなくてもかまいません. MeCabのダウンロードとインストールについては「MacでMeCabを使う」を参照のこと.
ダウンロード †
zlib †
- zlib Home Site
http://www.zlib.net/
current releaseのtar.gz formatのところにある「US (www.zlib.net)」をクリックしてzlib-1.2.3.tar.gzをダウンロードします.
QDBM †
- QDBM: Quick Database Manager
http://qdbm.sourceforge.net/
ダウンロードのところにある「最新のソース・パッケージ(バーション 1.8.77)」をクリックしてqdbm-1.8.77.tar.gzをダウンロードします.
Hyper Estraier †
- 全文検索システム Hyper Estraier
http://hyperestraier.sourceforge.net/
ダウンロードのところにある「最新のソース・パッケージ(バーション1.4.13)」をクリックしてhyperestraier-1.4.13.tar.gzをダウンロードします.
インストール †
zlib †
ダウンロードしたzlib-1.2.3.tar.gzをダブル・クリックして展開します.
ターミナルを起動して展開されたディレクトリーに移動し,次を実行します.
./configure make sudo make install
QDBM †
ダウンロードしたqbdm-1.8.77.tar.gzをダブル・クリックして展開します.
ターミナルを起動して展開されたディレクトリーに移動し,次を実行します.
./configure --enable-zlib make mac make check-mac sudo make install-mac
Hyper Estraier †
ダウンロードしたhyperestraier-1.4.13.tar.gzをダブル・クリックして展開します.
ターミナルを起動して展開されたディレクトリーに移動し,次を実行します.
./configure --enable-zlib --enable-mecab make mac make check-mac sudo make install-mac
MeCabを使わない場合は--enable-mecabを省略します.
Yosemite (10.10) だと
ld: symbol(s) not found for architecture x86_64
というエラーが出てコンパイル(正確にはコンパイル後のリンク)ができなくなりました.
そこで,configureした後にMakefileの
LIBS = -lqdbm -lz -liconv -lm -lc
の行の最後に -stdlib=libstdc++ を追加し,
LIBS = -lqdbm -lz -liconv -lm -lc -stdlib=libstdc++
としたらコンパイルできました.
使い方 †
インデックスの作成 †
estcmd create -acc -xs index
-accでN-gramの替わりに形態素解析を使用,-xsで文書数が50,000件未満,indexでインデックス名を指定しています.
文書の追加 †
estcmd gather -ft -il ja -lt -1 -um index path
-ftでプレーン・テキストを指定,-il jaで日本語を指定,-lt -1ですべてのテキストを解析,-umでMeCabを使用,indexでインデックス名を指定,pathで文書が格納されているディレクトリーのパスを指定しています.
インデックスの最適化 †
estcmd optimize index
文書の検索 †
estcmd search -vh index '検索 OR search'
-vhでスニペット付きの見やすい形で表示,indexでインデックス名を指定,検索 OR searchで検索式を指定しています.
Xcodeによるプログラミング †
「プログラミング・ガイド」のプログラムがそのまま動きます.
新規プロジェクトを「Application」の「Command Line Tool」でTypeを「C」にして作成し,main.cにサンプル・プログラムを貼付けます.
プロジェクトを選択して「情報」を開き,「ビルド」の「ライブラリ検索パス」に「/usr/local/lib」,「ヘッダ検索パス」に「/usr/local/include」,「他のリンカフラグ」に「-lm -liconv -lz -lqdbm -pthread -lresolv -lestraier」を追加します*1. プログラミング・ガイドには「-lnsl」も必要と書いてありますが,Mac OS Xでは不要です.(付けるとコンパイルできません.)
実行可能ファイルを選択して「情報」を開き,インデックスがあるディレクトリーを「作業ディレクトリの設定先」に指定すれば,「ビルドと実行」ができます.
検索スコアを取得する †
検索スコアを取得するプログラムを作成しました.
/* * search.c * search for Hyper Estraier * * * ./search NAME QUERY * * NAME インデックス名 * QUERY クエリー * * * Created by Tohgoroh Matsui on 2011.05.16 */ #include <estraier.h> #include <stdio.h> #include <string.h> int main (int argc, const char * argv[]) { const char *name = argv[1]; // インデックス名 const char *query = argv[2]; // クエリー ESTDB *db; ESTCOND *cond; int ecode, *res, num; int i; if (!(db = est_db_open(name, ESTDBREADER, &ecode))) { fprintf(stderr, "Error: %s\n", est_err_msg(ecode)); return 1; } cond = est_cond_new(); // 検索条件 est_cond_set_phrase(cond, query); // クエリー est_cond_set_options(cond, ESTCONDSCFB); // スコア取得オプション res = est_db_search(db, cond, &num, NULL); // 検索 for (i = 0; i < num; i++) { // 検索された文書のidとスコアを表示 printf("%d, %d\n", res[i], est_cond_score(cond, i)); } est_cond_delete(cond); free(res); if (!est_db_close(db, &ecode)) { fprintf(stderr, "Error: %s\n", est_err_msg(ecode)); return 1; } return 0; }
検索スコアを取得するには,検索を実行する前に検索条件にESTCONDSCFBオプションをセットします.
参考文献 †
- Hyper Estraierの設計と実装 | 平林幹雄 | SlideShare
- Hyper Estraierプログラミング・ガイド | Mikio Hirabayashi