postgresql 全文検索
必要なもの
mecab-0.97.tar.gz
mecab-ipadic-2.7.0-20070801.tar.gz
postgresql-8.2.12.tar.gz(好きなバージョンでOK)
pgmecab-1.1.tar.bz2
tar xvzf postgresql-8.2.12.tar.gz
cd postgresql-8.2.12
./configure --enable-nls=UTF8 --prefix=/usr/local/postgresql-8.2.12
make all
make install
tar xvzf mecab-0.97.tar.gz
cd mecab-0.97
./configure --with-charset=utf8
make all
make install
tar xvzf mecab-ipadic-2.7.0-20070801.tar.gz
cd mecab-ipadic-2.7.0-20070801
./configure --with-charset=utf8
make all
make install
cd /usr/local/src/postgresql-8.2.12/contrib/tsearch2
make all
make install
tar jxvf pgmecab-1.1.tar.bz2
cd pgmecab-1.1
vi Makefile
MECAB_CONFIG_PATH =
を
MECAB_CONFIG_PATH = /usr/local/bin/mecab-config
に変更
top_builddir =
を
top_builddir = /usr/local/src/postgresql-8.2.12/
に変更
make all
make install
su postgres
createdb sample
/usr/local/pgsql/bin/psql -U postgres -d sample -e -f /usr/l
ocal/pgsql/share/contrib/tsearch2.sql
/usr/local/pgsql/bin/psql -U postgres -d sample
UPDATE pg_ts_cfg SET locale='ja_JP.UTF-8' WHERE ts_name='simple';
q
vi /usr/local/pgsql/share/contrib/pgmecab.sql
で
AS '$libdir/pgmecab', 'pgmecab'を
AS '/usr/local/pgsql/lib/pgmecab', 'pgmecab'に変更
/usr/local/pgsql/bin/psql -U postgres -d sample -e -f /usr/local/pgsql/share/contrib/pgmecab.sql
ここでエラーが出る
vi pgmecab.c して
#include "fmgr.h"
すぐ後に以下を追加
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif
再度
make all
make installして
新しいlibpgmecab.so郡を作成
mv libpgmecab* /usr/local/pgsql/lib
/usr/local/pgsql/bin/psql -U postgres -d sample -e -f /usr/local/pgsql/share/contrib/pgmecab.sql
(ここでわかちがき用の関数pgmecabが登録される)
ためしに呼び出す。
SELECT * FROM pgmecab('TOEICのスコアを上げるためのノウハウ記事が満載!');
pgmecab
-------------------------------------------------------------
TOEIC の スコア を 上げる ため の ノウハウ 記事 が 満載 !
(1 row)
次にやることはtsvector形の列を追加すること
ALTER TABLE item ADD item_tsv tsvector;
(item_tsvは新しいtsvector形のカラムなので名前は何でもよし。
但し、下の作業で使うので注意)
トリガ作成
CREATE TRIGGER tsvectorchange BEFORE UPDATE OR INSERT ON t_target
FOR EACH ROW EXECUTE PROCEDURE tsearch2(item_tsv,pgmecab,(ここはカラム名));
インデックス作成
CREATE INDEX idx_item_tsv ON item USING gist(item_tsv);
itemのitem_tsvを更新するためにアップデート処理
UPDATE item SET id = id;
新しい型を登録
drop type finddoctype;
(finddoctypeと言う名前の型が登録されてたらまず削除)
create type finddoctype as (findindex integer);
(新しい型を登録)
drop function finddoc(text);
create function finddoc(text) returns setof finddoctype as
'
select findtbl.itemid as findindex from
( select fromtbl.itemid,fromtbl.text1 from item as fromtbl,
to_tsquery('simple', replace(pgmecab($1), ' ', '&')) as q
where fromtbl.tsv_item @@ q offset 0 )
as findtbl
where findtbl.text1 like ''%'' || $1 || ''%'';
' language sql;
select * from finddoc('中国');
itemidが返ってくればOK
だが、上手く動かない。
to_tsquery('simple', replace(pgmecab($1),'', '&')) as q
部分においてpgmecab($1)がわかち書きを返すときに
文字列の終端にスペースを返してくるがコレを置換しようとしても上手くいかず・・・・・
そのため
select * from finddoc('サンプルテスト');
としても作成した関数内部でサンプル&テスト&と変換される。
どうしたもんか・・・・
どうやら空白だけじゃなく改行も返してくれてるらしい・・・・・・・・・・
なので空白のみ除去しようとしてもヒットしない訳だ。
btrim(pgmecab($1),E' n'))
として
CREATE OR REPLACE FUNCTION finddoc(text)
RETURNS SETOF finddoctype AS
$BODY$
select findtbl.itemid as findindex from
( select fromtbl.itemid,fromtbl.text1 from item as fromtbl,
to_tsquery('simple', replace(btrim(pgmecab($1),E' n'), ' ', '&')) as q
where fromtbl.tsv_item @@ q offset 0 )
as findtbl
where findtbl.text1 like '%' || $1 || '%';
$BODY$
LANGUAGE 'sql' VOLATILE;
上記が動いた関数
以上 長かった・・・・・・・・・・・・・ orz