適当に・・・

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

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 よりは簡単かな。
後は精度と速度かな。。。。


BI

2009年03月24日 11時13分48秒 | Weblog
BI = ビジネスインテリジェンス

excel手動はどうかと思いながら3年が経過
(自分がやってるわけじゃないからどーでもいいことなんだけどw)

OpenOLAP

OpenStandia

色々あるんだから、ちょっと調べりゃ使えそうなものたくさんあるのにねw
作業効率の悪いこと悪いこと

APC インストール

2009年03月23日 13時52分53秒 | PHP
APC = Alternative PHP Cache

php バージョン php-5.2.9
APC バージョン APC-3.1.2

phpはインストール済みとする。

tar xzvf APC-3.1.2.tgz
cd APC-3.1.2
phpize
./configure --enable-apc

(何か、configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.って言われてるよ。 ちーぃっ!!! って事で)

re2c-0.13.5.tar.gzをダウンロードしてきて
tar xvzf re2c-0.13.5.tar.gz
cd re2c-0.13.5
./configure
make all
make install

再度
cd ../APC-3.1.2
phpize
./configure
make all
make test
make install

ここで /usr/local/lib/php/extensions/no-debug-non-zts-20060613/apc.so
が出来上がる。

php.iniの一番したに
[apc]
extension="/usr/local/lib/php/extensions/no-debug-non-zts-20060613/apc.so"
apc.mode = mmap
apc.cachedir = /tmp
apc.check_compiled_source = 1
apc.check_mtime = 1
を追加する。

httpdをリスタート

phpinfoを呼び出すページを作って確認・・・・・・・
動いた・・・・・・orz

っで今までのテスト機でやったのでじゃー本番機でGoっと思ったら。
本番機はすべてyumとかrpmで構成されてる。。。。
再び ちーぃっ!!!って事で。。。

yum -y install php-pear (pecl)
yum -y install php-devel (phpize)
yum -y install httpd-devel (apxs)

で pecl install APC を実行
・・・・・・・
キター エラー

Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 92160 bytes) in /usr/share/pear/PEAR/Dependency2.php on line 396
Allowed memory size of 8388608 bytes exhausted (tried to allocate 0 bytes)

php.iniのmemory_limitを増やしたが同じエラー

ここでgoogle大先生
pearcmd.phpの先頭に
@ini_set(’memory_limit’, ‘32M’);
とか付け加える。

再度

pecl install APC

OK 通った・・・・

/etc/php.d/apc.ini を新規作成して
extension = apc.so
として保存

httpdを再起動
phpinfoを実行してapcの項目を確認

以上。

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

ファイル共有

2009年03月03日 13時58分58秒 | Linux
ファイル共有
とタイトルをつけたが、
個人情報が漏れる例のp2pアプリの話ではない。

nfsでなくて手軽にサーバ側のファイル共有ができないかな~と
言う疑問に対してgoogle大先生は
「SSHFS」と言う道を示してくれた。

SSHが動いてりゃOKなんでこれが簡単。

考える人 考えない人

2009年03月02日 12時04分57秒 | Weblog
まあ適当にタイトルをつけたが、
postgresqlを使用してサービスを運用している。
で、いつも思うことは速度を犠牲に
重いアプリを作って誰も何も言わないこと。

http://neta.ywcafe.net/000960.html

を見ると
WEBでの勝ち組?(と思ってる)会社は
やっぱり速度を気にしてる。

たった、0.1秒と思うかされど0.1秒と思うかは
大きな違い。

人に来てもらいたい。人に見てもらいたい。
いいサービスを提供したいと言ってるにもかかわらず。
重いアプリ。

すげーよ。そしてそれに対して苦言を呈すると、
言い方がどうのとかもっと考えて発言しようよとか
言ってるしw

言い方なんてどうでもいいと思うし、捕らえ方の違いなんだから、
行動してから言い方の文句言ってもらいたいもんだと思ってる。

ただ、コード書いて。動きました。OKですって言うなら、
学生でもできるつーの。

先の無い会社、企業ってのはこんなもんだw