はじめに †
組み込み型全文検索エンジンSennaには標準でRubyバインディングがついてきます.
ここでは,その使い方についてメモしておきます. MacへSennaをインストールする方法についてはこちらのページを参照してください.
Mac OS X 10.5.7とSenna 1.1.4とRuby 1.9.1で確認しました.
ログ †
ログは/var/senna/log/senna.logに出力されます. そこで,ディレクトリーを作成し,権限を与えます.
$ sudo mkdir /var/senna/log $ sudo chmod 755 /var/senna/log
Sennaがうまく動かないときは,このログに書き込まれたエラー・メッセージを確認して原因を推測します.
ただし,ログ・ファイルのサイズがものすごい勢いで大きくなるため,必要がないときは書き込みを禁止しておきます.
$ rm /var/senna/log/senna.log $ touch /var/senna/log/senna.log $ chmod 444 /var/senna/log/senna.log
ポイント †
SennaのAPIが文字列の終端の判定をNULL文字で行っているため,Rubyでは文字列の最後にNULL文字(0x00)を追加する必要があります. (C言語では文字列の終端がNULL文字で表されるため,明示的に追加する必要はありません.)
def append_nullchar(s) return (s.unpack("C*") + [0x00]).pack("C*") end
文字列の最初が「 」(空白)だとなぜかインデックスが作成されません.
サンプル・プログラム †
インデックスを作成し,4つの文章を登録し,インデックスの内容を表示します.
インデックスの文字コードはutf-8にしています. そこで,プログラムもutf-8で作成します.
# -*- encoding: utf-8 -*- require 'senna' # 文字列の最後にNULL文字を追加するメソッド def append_nullchar(s) return (s.unpack("C*") + [0x00]).pack("C*") end # インデックスtestを作成します index = Senna::Index.create("test",0,0,0,Senna::ENC_UTF8) # インデックスに文章を追加します index.upd('0001', nil, append_nullchar('プログラミング言語を勉強しました.')) index.upd('0002', nil, append_nullchar('私は言語学者ではありません.')) index.upd('0003', nil, append_nullchar(' 私が使用している言語は日本語です.')) index.upd('0004', nil, append_nullchar('仕事のためにこのプログラムを作りました.')) # インデックスを検索します rcs = index.sel(append_nullchar('言語')) if rcs != nil print rcs.nhits, "\n" while rcs.next != nil print rcs.curr_key, "\n" end end index.close; # sen_symインスタンスを開きます sym=Senna::Sym.open("test.SEN.l") print "Open ", sym, "\n" size = sym.size print "size=", size, "\n" # sen_symインスタンスに登録されているデータを表示します. for i in (1..size) do len, s = sym.key(i) # printf "%d : %d : %s \n", i, len, s printf "%d : %d : %s : %s\n", i, len, s.unpack("H*"), s; end sym.close;