PythonからTokyo Cabinetを操作して全文検索を実装する-データの投入と検索

2012-05-02
このエントリーをはてなブックマークに追加

PythonからTokyo Cabinetを操作して全文検索を実装する-まずは環境構築の続き。データの投入と検索です。

#! /usr/bin/python
# -*- coding: utf-8 -*-

from tokyocabinet import table

tc = table.Table()
tc.open(‘test.tct’, table.TDBOWRITER | table.TDBOCREAT)

tc[‘key’] = {‘value’: ‘Hello Tokyo Cabinet’}

#トークン転置インデックスを作成
tc.setindex(‘value’, table.TDBITTOKEN)

#これは全レコードの件数
print len(tc)

#検索
q = tc.query()
q.addcond(‘value’, table.TDBQCSTRAND, ‘Tokyo’)

#ヒットした件数
print q.count()
#検索結果の出力
for item in q.search():

print item

tc.close()

インデックスの作成は毎回やる必要はないです。コードから作成するサンプルです。これでtest.tctというデータファイルとtest.tct.idx.value.tokというインデックスファイルが作成されます。

トークンは形態素解析して半角スペースでつなげたものを使いました。サンプルはその部分を割愛しましたが、「私負けましたわ」という文章を突っ込む場合には「私 負け まし た わ」となります。

相変わらずMeCabのお世話になってます。

正直パラメータとかは自信無いです。間違ってたらごめんなさい。

某QAサイトからサンプルデータをちょっとお借りして、200万件ほど投入して検索してみましたが、20ミリ秒くらいでヒット件数とレコードを取得できました。

手軽で高速。これはいろいろ活用してみたいですね。

PythonからTokyo Cabinetを操作して全文検索を実装する-まずは環境構築

2012-04-26
このエントリーをはてなブックマークに追加

途中まで書いて長くなりそうだったので、環境構築とコーディングの2部構成にします。まずは環境構築です。

全文検索っていっても名寄せとかしてないからただ単にSQLでいうところのLike検索とおんなじなんですけど、RDBじゃなくてKVS使うところがポイントです。

「なんでMySQLとかのRDBじゃなくてKVS?」っていうところは長くなるので割愛します。まぁcount()が遅かった、っていうだけなんですけどね。アレはチューニングでどにかなるのかなぁ。

TokyoCabinetのインストール

wget http://fallabs.com/tokyocabinet/tokyocabinet-1.4.47.tar.gz
tar zxfv tokyocabinet-1.4.47.tar.gz
cd tokyocabinet-1.4.47
./configure
make
make install

これだけ。

インストールにはいろいろ諸々必要なのですが、ハセテツの環境だとbzip2-develだけいれれば大丈夫でした。まぁ足りなければ./configureで教えてくれるでしょう。

Tokyo Tyrantは今回はインストールしません。Pythonから直接Tokyo Cabinetを叩きます。

次はPythonからTokyo Cabinetを叩くためにpython-tokyocabinetをインストールします。

pip install tokyocabinet

/etc/ld.so.conf に
/usr/local/lib
を追記して
/sbin/ldconfig

これまた簡単。’12.4月時点でバージョン0.5がインストールされます。

 #! /usr/bin/python
# -*- coding: utf-8 -*-

from tokyocabinet import btree

tc = btree.BTree()
tc.open(‘test.tcb’, btree.BDBOWRITER | btree.BDBOCREAT)

tc[‘key’] = ‘Hello TokyoCabinet’

print tc[‘key’]

tc.close()

上記サンプルが実行できて、「Hello TokyoCabinet」と表示されれば成功です。