PostgreSQLで全文検索
インストール済みのPostgreSQL 8.2.5 + Ludia 1.4.0 で全文検索ができるようにする。
必要なパッケージの取得と展開
mecab-0.96、mecab-ipadic-2.7.0-20070801(辞書)、senna-1.0.9、ludia-1.4.0が同梱されたお買い得な(?)パッケージ(ludia-withdeps-1.4.0.tar.gz)をダウンロード します。
ダウンロードしたパッケージは、postgresql-8.2.5.tar.gzと同じく/usr/local/src/ にでも置きましょう。:
# su - postgres $ cd /usr/local/src/ $ tar -zxf ludia-withdeps-1.4.0.tar.gz
MeCabのインストール
形態素解析をして「分かち書き」(何のことだか分かりませんが)を行うMeCabをインストールします。:
$ cd ludia-1.4.0/deps/ $ tar -zxf mecab-0.96.tar.gz $ cd mecab-0.96/ $ ./configure --with-charset=utf8 $ make $ su # make install # exit
MeCab-ipadicのインストール
MeCab用辞書のインストールをします。:
$ cd ../ $ tar -zxf mecab-ipadic-2.7.0-20070801.tar.gz $ cd mecab-ipadic-2.7.0-20070801/ $ ./configure --with-charset=utf8 $ make $ su # make install # exit
Sennaのインストール
全文検索エンジンのSenna(セナと発音)をインストールします。:
$ cd ../ $ tar -zxf senna-1.0.9.tar.gz $ cd senna-1.0.9/ $ ./configure $ make $ su # make install # exit
Ludiaのインストール
全文検索エンジンSennaを利用し、データベース内のテキスト情報を高速検索するLudiaのインストールをします。:
$ cd /usr/local/src/ludia-1.4.0/ $ ./configure --with-pg-config=/usr/local/pgsql/bin/pg_config --with-senna-cfg=/usr/local/bin/senna-cfg $ make $ su # make install
インデックスアクセスメソッドの登録
メソッドの登録はデータベース毎に行います。:
$ /usr/local/pgsql/bin/psql -U postgres -f /usr/local/pgsql/share/pgsenna2.sql ping (注 pingはcreatedbコマンドで作成したデータベース名)
postgresql.confファイルの編集
/usr/local/pgsql/data/postgresql.conf に次のものを追記します。:
custom_variable_classes = 'ludia' ludia.max_n_sort_result = 10000 ludia.enable_seqscan = on ludia.seqscan_flags = 1 ludia.sen_index_flags = 31 ludia.max_n_index_cache = 16 ludia.initial_n_segments = 512
設定を反映させるためにPostgreSQLを再起動します。:
# /etc/init.d/postgresql reload
全文検索用インデックスの作成
全文検索用インデックスはテーブルの項目毎に作成します。:
$ psql ping ping=# CREATE INDEX pingupdate_entrydescription ON pingupdate USING FULLTEXT(entrydescription);
検索テスト
papasanや奥さん で検索してブログのエントリーURLを取り出します。:
ping=# SELECT entryurl FROM pingupdate WHERE entrydescription @@'papasan';
entryurl
---------------------------------------------------------------------------------------------------------
http://rd.yahoo.co.jp/rss/l/blog/myblog/rss2/item/*http://blogs.yahoo.co.jp/classiclll_jp/47727602.html
http://papasan.org/papablog/278
http://www.hage88.com/xoops/modules/weblog/details.php?blog_id=249
http://www.hage88.com/xoops/modules/weblog/details.php?blog_id=239
http://papasan.org/papablog/286
http://www.hage88.com/xoops/modules/weblog/details.php?blog_id=252
http://lightson.dip.jp/blog/seko/1241
http://lightson.dip.jp/blog/seko/1239
http://papasan.org/papablog/267
http://www.hage88.com/xoops/modules/weblog/details.php?blog_id=244
http://colin-cube.com/blog/article.php?id=77
http://hlf.homeip.net/xoops/modules/weblog/details.php?blog_id=89
http://owa.as.wakwak.ne.jp/zope/coreblog/175
http://www.hage88.com/xoops/modules/weblog/details.php?blog_id=223
http://www.hage88.com/xoops/modules/weblog/details.php?blog_id=243
http://plaza.rakuten.co.jp/nxuser/diary/200707150002/
http://lightson.dip.jp/blog/seko/1342
http://papasan.org/papablog/329
http://lightson.dip.jp/blog/seko/1352
http://www.hage88.com/xoops/modules/weblog/details.php?blog_id=264
http://papasan.org/papablog/374
http://www.hage88.com/xoops/modules/weblog/details.php?blog_id=277
http://lightson.dip.jp/blog/seko/1403
http://lightson.dip.jp/blog/seko/1411
http://lightson.dip.jp/blog/seko/1415
http://lightson.dip.jp/blog/seko/1424
http://papasan.org/papablog/402
http://papasan.org/papablog/409
http://lightson.dip.jp/blog/seko/1444
http://petersworks.dyndns.org/blog/?p=37
http://papasan.org/papablog/429
http://lightson.dip.jp/blog/seko/1476
http://lightson.dip.jp/blog/seko/1484
http://papasan.org/papablog/442
http://owa.as.wakwak.ne.jp/zope/coreblog/202
http://papasan.org/papablog/451
http://papasan.org/papablog/461
http://lightson.dip.jp/blog/seko/1522
http://lightson.dip.jp/blog/seko/1543
http://papasan.org/papablog/480
http://papasan.org/papablog/481
(41 rows)
ping=# SELECT entryurl FROM pingupdate WHERE entrydescription @@'奥さん';
entryurl
-------------------------------------------------------
http://gotanda.blog43.fc2.com/blog-entry-83.html
http://gotanda.blog43.fc2.com/blog-entry-89.html
http://d.hatena.ne.jp/PEPPERMINT/20070818#p1
http://plaza.rakuten.co.jp/nxuser/diary/200709290000/
http://dynanikki.exblog.jp/6459288/
http://dynanikki.exblog.jp/7264933/
http://lightson.dip.jp/blog/seko/1544
(7 rows)
その他
- Ludia-1.4.0のREADME(日本語) にインストール方法など詳しく掲載されています。
- 「Junker'sRing Topics」 に実装してみました。