読者です 読者をやめる 読者になる 読者になる

pg_senna インストール

PostgreSQL Senna

結構苦労したり……

pg_senna - Postgres Binding For Sennaを参考に、しようと思ったらソースに Makefile が含まれていない。
Makefile.am と configure.ac があるので、これは autoconf, automake を使うということか。って一回も使ったことないんだけど。
以下、まったく autoconf, automake を理解していないので変なことをしている可能性大。
試行錯誤の末、リポジトリの rev.14 から以下のようにソースを修正した。

===================================================================
--- configure.ac        (リビジョン 14)
+++ configure.ac        (作業コピー)
@@ -12,6 +12,7 @@
 VERSION=$PG_SENNA_MAJOR_VERSION.$PG_SENNA_MINOR_VERSION.$PG_SENNA_MICRO_VERSION
 AC_COPYRIGHT([Copyright (c) 2005 Daisuke Maki <dmaki@cpan.org>])
 AC_CONFIG_SRCDIR([src/pg_senna.c])
+AC_CONFIG_HEADERS([src/config.h])
 AM_INIT_AUTOMAKE(pg_senna, $VERSION)

 # Checks for programs.
Index: src/pg_senna.h
===================================================================
--- src/pg_senna.h      (リビジョン 14)
+++ src/pg_senna.h      (作業コピー)
@@ -34,7 +34,7 @@
 #include <commands/trigger.h>
 #include <executor/spi.h>
 #include <miscadmin.h>
-#include <server/utils/palloc.h>
+#include <utils/palloc.h>

 #include <senna.h>
 #include <stdlib.h>

configure.ac のは autoheader コマンドが

autoheader: error: AC_CONFIG_HEADERS not found in configure.ac

とのたまうので。pg_senna.h のは pg_config コマンドが返す include path に "server/" が含まれているのでその重複を避けるため。

さらに、automake で "required file `./ltmain.sh' not found" と言われるので、/usr/share/libtool/ltmain.sh をカレントディレクトリにコピー。

この状態で

$ autoheader
$ aclocal
$ automake -a
$ autoconf
$ ./configure
$ make
# make install

としてインストール。すると /usr/lib/pgsql/lib 以下にインストールされてしまった。/usr/lib/pgsql 以下に入ってほしいのだが。とりあえず手動でファイルを移動。( mv pg_senna.* ../ )

あとは psql から…

\i src/pg_senna.sql
SELECT pg_senna_create_index('entry', 'body');   -- senna index 作成
\timing
SELECT * FROM entry WHERE id IN(SELECT 'entry'::SENNA @@ 'Plagger');
(略)
Time: 16.552 ms

SELECT * FROM entry WHERE body LIKE '%Plagger%';
(略)
Time: 97.465 ms

対象は、Plagger の Store::DBIC で保存した全文入りの entry. 約8000レコード、6MB程度のデータ。
この程度のデータ量だと差が少ないけど、もっと大量のレコードを検索すれば差が開くはず。