中国語のPostgresまたはPostgresで中国語の全文検索を設定する

画像



クライアントから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( '批&規約');



質問、提案、提案はコメントに記入してください。

ご清聴ありがとうございました!



All Articles