適当に・・・

何の目的も無くブログを立ち上げてみました。更新は不定期ですね。

postgresql 型 一覧 SQL

2009年07月07日 18時09分22秒 | PostgreSQL
select
--pg_attribute.attname,
pg_type.typname as type
--pg_attribute.attlen
from
pg_attribute,
pg_type
where
pg_attribute.atttypid = pg_type.oid AND
( pg_attribute.atttypid <26 OR pg_attribute.atttypid > 29 ) AND
attrelid IN (
select
pg_class.oid
from
pg_class,
pg_namespace
where
relname in (select c.relname as "Name"
from pg_catalog.pg_class c
left join pg_catalog.pg_user u on u.usesysid = c.relowner
left join pg_catalog.pg_namespace n on n.oid = c.relnamespace
where c.relkind IN ('r','')
and n.nspname NOT IN ('pg_catalog', 'pg_toast')
and pg_catalog.pg_table_is_visible(c.oid)
) and
pg_class.relnamespace=pg_namespace.oid AND
pg_namespace.nspname='public'
)
group by type
order by type

Postgresql 正規表現

2009年06月11日 14時45分37秒 | PostgreSQL
昔は「せいきひょうげん」ときいてちょっとエロいと思っていた
大バカ者の私www

正規表現だからね。

でpostgresqlのtext型のカラムのデータにHTMLのタグを
丸ごと埋め込んで表示している。
我が会社のデータベース。

HTMLのタグだけ落としたいと思ったんだけど、
replace関数だと何回も処理しなきゃならねー。
そんな面倒なことやってられっかってことで、
エロい正規表現で置換出来ね?と調べたらあったwww

regexp_replace(カラム名,'正規表現','置換後文字列')

的な感じで。8.1からだったからギリギリバージョンは対応してるな。
そろそろバージョン上げたいとおもってるんだけど~。
8.4はやくでねーかな。

※追記
>regexp_replace(カラム名,'正規表現','置換後文字列')
だと一回目にヒットしたものしか置換しねーしw
sedみたいに

regexp_replace(カラム名,'正規表現','置換後文字列','g')
とかやると一致したすべてのパターンを置換後文字列で置換してくれる。

「せいきひょうげん」 と 「ちかん」・・・・・orz
なんだかな~w 思い浮かぶのはこんなのばっかりかwww

以上

postgresql 全文検索 (Ludia)

2009年03月25日 14時59分43秒 | PostgreSQL
postgresql 全文検索

必要なもの
postgresql-8.2.12.tar.gz(好きなバージョンでOK)
ludia-withdeps-1.5.1.tar.gz (最新バージョンで)
[mecab,mecab-ipadic,sennaがついたパッケージ]

tar xvzf ludia-withdeps-1.5.1.tar.gz
cd ./ludia-1.5.1/deps/

(mecabインストール)
tar xzvf mecab-0.97.tar.gz
cd ./mecab-0.97
./configure --with-charset=utf8
make all
make install

(mecab辞書インストール)
cd ../
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

(sennaインストール ちょっと時間掛かる・・・)
cd ../
tar xvzf senna-1.1.3.tar.gz
cd senna-1.1.3
./configure
make all
make install

(ludiaのインストール)
cd ../../
./configure --with-pg-config=/usr/local/pgsql/bin/pg_config --with-senna-cfg=/usr/local/bin/senna-cfg
make all
make install

テスト用のDB作成
createdb sample2

/usr/local/pgsql/bin/psql -U postgres -f /usr/local/pgsql/share/pgsenna2.sql sample2

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の再起動もしくはreload

CREATE INDEX ftext ON item USING FULLTEXT(description);

******************** 補足 ***********************************

fulltext : 正規化 + 形態素解析 (SEN_INDEX_NORMALIZE)
fulltextb : 正規化 + 2-gram (SEN_INDEX_NORMALIZE|SEN_INDEX_NGRAM)
fulltextu : ユーザ定義

って言うのをしらずにずっとfulltextを使用していた。
書いてある通り fulltextb の方が2-ngramを使用するのでこっちがいいかも

CREATE INDEX ftext ON item USING FULLTEXTB(description);
って指定するんだってw

*****************************************************************

select itemid from item where description @@'テスト'

で結果が返ってくればOK

pgmecab よりは簡単かな。
後は精度と速度かな。。。。


postgresql 全文検索 (pgmecab)

2009年03月19日 16時41分07秒 | PostgreSQL
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

postgresql 全文検索

2009年02月05日 14時27分54秒 | PostgreSQL
postgresql 全文検索

タイトルの通りpostgresの全文検索の事
インストール記事とかではないけれど。

正直、postgresの全文検索って何が良いの?

まあ、良いと言う表現が曖昧だな。
検索が早く更新も早い。

他のモジュールよりも検索が早く、更新も早いのは
どれなのだろうか?と

Rast
Ludia
Tsearch2
Senna
と色々あるけれど。。。

と書いたが、マシン構成によってもずいぶんちがうのだろな~
と今思ったLudiaとかスゲーメモリ積めば早いよ的なこと書いて
あったしなー。

どうするかなー。


PostgreSQL 8.3

2008年05月13日 19時34分58秒 | PostgreSQL
PostgreSQL 8.3

postgresql-8.3.0.tar.gz
をダウンロードして、

(groupadd postgres
useradd -g postgres postgresは実行済み)

あんまり変更ないですけど。
ビルドするのは

ソースを
/usr/local/src/に移動して

tar xvzf postgresql-8.3.0.tar.gz で
cd postgresql-8.3.0

./configure --enable-nls=UTF8 --prefix=/usr/local/postgresql-8.3.0
(なんか--enable-multibytes=UTF8がignoredだって言われてINSTALLみたらnlsに変わってた。
ちなみに --with-libxmlをつけたらライブラリ無しで怒られた。
面倒なのでコレはなしで行きましょってことでw)

make all
make install

cd /usr/local/ で

chown -R postgres:postgres postgresql-8.3.0
ln -s /usr/local/postgresql-8.3.0 pgsql

postgresユーザの.bash_profileに
PG=/usr/local/pgsql(インストールパスorシンボリックリンク)
PATH=$PATH:$PG/bin
export MANPATH=$MANPATH:$PG/man
export PGLIB=$PG/lib
export PGDATA=$PG/data(任意)

mkdir /opt/data
chown -R postgres:postgres /opt/data
su postgres
initdb -D /opt/data --no-locale --encoding=UTF8 (文字コードはUTF8を使用)

postmaster -i -D /opt/data
で起動はするが、バックグラウンド 8.1までは -S オプションがあったがそれが
見当たらないw

なんかpg_ctl start -s -D /opt/dataでサイレントモードで起動するから
コレが正式っぽい
/etc/init.d/postgres を書き直しな予感

Postgresql インストール

2008年01月25日 11時03分35秒 | PostgreSQL
Postgresql インストール

最新版 ソースコードの取得
postgresql-8.1.11.tar.gz (2008/1/25日現在)

/usr/local/srcに配置
tar xvzf postgresql-8.1.11.tar.gz

./configure --enable-multibytes=UTF8 --prefix=/usr/local/postgresql-8.1.11

/*****************************************************************************
オプション
--prefix=/aaa/bbb/ccc インストールしたいディレクトリのパス
--with-pgport=ポート番号 サーバとクライアントが使用するデフォルトのポート番号
--with-openssl SSL接続のサポートが有効になります。
--with-pam pam でアクセスを制限したい場合に指定します。
*****************************************************************************/

make all
make install

ln -s /usr/local/postgresql-8.1.11 /usr/local/pgsql
chown -R postgres:postgres /usr/local/pgsql

postgresユーザの.bash_profileに
PG=/usr/local/pgsql(インストールパスorシンボリックリンク)
PATH=$PATH:$PG/bin
export MANPATH=$MANPATH:$PG/man
export PGLIB=$PG/lib
export PGDATA=$PG/data(任意)

mkdir /opt/data
chown -R postgres:postgres /opt/data
su postgres
initdb -D /opt/data --no-locale --encoding=UTF8 (文字コードはUTF8を使用)

postmaster -i -S -D /opt/data でデータベース起動

以上。(なんか前にも書いた気がするけど見当たらないのでもう一度)