![画像](https://habrastorage.org/getpro/habr/post_images/0de/036/629/0de0366290ce2d08d5b070f9eaf1e6de.png)
クライアントからPostgreSQLを最新バージョンに更新すると同時に、中国語を教えるようにというリクエストがありました。
より正確には、中国語で全文検索のプロセスを最適化するために、全体が容赦なく遅くなったためです。
以下は、これをどのように行ったかを説明しています。
すぐにビジネスに取りかかりましょう。
最初にすることは、Simple Chinese Word Segmentation(SCWS)とzhparser拡張機能自体をビルドしてインストールすることです
SCWS
wget -q -O - http://www.xunsearch.com/scws/down/scws-1.2.2.tar.bz2 | tar xf - cd scws-1.2.2 ; ./configure ; make install
今zhparser
github.com/amutu/zhparser-同時に本格的な指示があり、それを行います。
git clone https://github.com/amutu/zhparser.git SCWS_HOME=/usr/local make && make install
成功した場合は、目的のデータベースで拡張機能を有効にします
psql -U postgres -d test_dbname -c 'CREATE EXTENSION zhparser'
次に、目的のデータベースに移動して構成を作成します
test_dbname=# CREATE TEXT SEARCH CONFIGURATION testzhcfg (PARSER = zhparser); test_dbname=# ALTER TEXT SEARCH CONFIGURATION testzhcfg ADD MAPPING FOR n,v,a,i,e,l WITH simple;
すでにデータのあるテーブルがあるとします。
CREATE TABLE messages ( title text, body text );
そして、タイトルと本文の列を検索する必要があります。 そのような記録がありますように
INSERT INTO messages VALUES('批发新', '款新婴幼');
これを行うには、トークンのtsvectorタイプのtsv列を追加する必要があります。
test_dbname=# ALTER TABLE messages ADD COLUMN tsv tsvector;
ジンインデックス(https://ru.wikipedia.org/wiki/GIN)
test_dbname=# CREATE INDEX tsv_idx ON messages USING gin(tsv);
ここで、以前に作成したpublic.testzhcfg構成を使用して、tsv列のトークンを自動的に更新するトリガーを作成します。
test_dbname=# CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE ON messages FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger( tsv, 'public.testzhcfg', title, body );
そして最後のステップ。
新しいトリガーでtsv列を更新する必要があります。 (また、挿入および更新時にアクティブになる)、このために、UPDATEを使用して、タイトルフィールドと本文フィールドの現在の値を同じ値に書き換えます。
test_dbname=# UPDATE messages SET title=title, body=body;
試すことができます
SELECTタイトル、本文FROMメッセージWHERE tsv @@ to_tsquery( '批&規約');
質問、提案、提案はコメントに記入してください。
ご清聴ありがとうございました!