Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】使用 Zhparser 插件实现 PostgreSQL 中文全文检索

2025年09月19日に「Dev.to」が公開したITニュース「使用 Zhparser 插件实现 PostgreSQL 中文全文检索」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

PostgreSQLで中国語の全文検索を実現するZhparserプラグインの導入方法。Docker環境でコンパイルから設定までを行い、中国語テキストを適切な単語に分割して効率的な検索を可能にする。システムエンジニア初心者向けの具体的な手順。

ITニュース解説

システムエンジニアが普段扱うデータベースの一つにPostgreSQLがある。これは、情報を整理して保存し、必要な時に取り出せるようにするソフトウェアだ。ウェブサイトのユーザー情報や商品の在庫管理など、さまざまなデータの保管に使われる。このデータベースには、保存された文章の中から特定のキーワードを含むものを探し出す「全文検索」という便利な機能が備わっている。しかし、日本語や中国語のような言語は、単語と単語の間にスペースを入れないため、英語のように単純にスペースで区切って単語を認識することが難しい。特に中国語では、この単語区切りの問題が全文検索の大きな壁となる。

そこで登場するのが「Zhparser」というPostgreSQLの拡張機能だ。Zhparserは、中国語の文章を正しく単語に分解し、PostgreSQLの全文検索機能が中国語を扱えるようにする役割を担う。これにより、中国語の長い文章の中からでも、狙ったキーワードを正確に見つけ出すことが可能になる。

Zhparserを使うための環境を準備するには、Dockerという技術が非常に有効だ。Dockerは、アプリケーションを「コンテナ」と呼ばれる独立した環境で動かすためのもので、自分のPCの環境を汚さずに、手軽にPostgreSQLやZhparserを試すことができる。記事では、docker runコマンドを使ってPostgreSQLのコンテナを立ち上げている。このコマンドには様々な設定が含まれている。--name postgresはコンテナに「postgres」という名前を付けることを意味し、-e POSTGRES_PASSWORD=postgresはPostgreSQLの管理者パスワードを「postgres」に設定する。-e TZ=PRCはタイムゾーンを中国標準時(PRC)に設定し、--restart=alwaysはDockerが起動するたびにコンテナも自動的に起動するようにする設定だ。-e PGDATA=/var/lib/postgresql/data/pgdataはPostgreSQLのデータ保存場所をコンテナ内で指定している。さらに重要なのが、-v /var/docker/postgres:/var/lib/postgresql/dataという部分で、これはPCの/var/docker/postgresというフォルダとコンテナ内の/var/lib/postgresql/dataというフォルダを同期させ、コンテナが停止してもデータが失われないようにする設定だ。-p 5432:5432は、PCのポート5432番とコンテナのポート5432番を接続し、PCからPostgreSQLにアクセスできるようにする。最後に-d postgresは、postgresという名前の公式イメージをダウンロードして、バックグラウンドでコンテナを起動することを意味する。コンテナが起動したら、docker exec -it postgres bashというコマンドを使って、コンテナの中にログインし、そこでZhparserのインストール作業を進めることになる。このコマンドは、起動中の「postgres」コンテナ内で「bash」というシェルを実行し、そのシェルにインタラクティブに接続するためのものだ。

コンテナ内に入ったら、まずZhparserが動作するために必要なソフトウェアをインストールする。具体的には、apt update -y && apt install lsb-release wget gcc make git bzip2 postgresql-server-dev-17 -yというコマンドを実行する。apt updateはパッケージリストを最新の状態にし、apt installは必要なツール群をまとめてインストールする。gccmakeはソフトウェアをソースコードからコンパイルする際に必要となる開発ツールで、gitはZhparserのソースコードをダウンロードするために使われる。postgresql-server-dev-17は、PostgreSQLの拡張機能を開発・コンパイルするために必要なファイル群で、バージョン17用のものだ。

次に、Zhparserが依存する別の中国語形態素解析ライブラリである「SCWS」をインストールする。これは中国語の文章を単語に区切る機能を持つ。wgetコマンドでSCWSの圧縮ファイルをダウンロードし、tar -jxvfで解凍する。解凍されたディレクトリに移動し、./configure && make && make installという一連のコマンドを実行してSCWSをシステムに組み込む。./configureはシステム環境に合わせてビルド設定を行い、makeはソースコードをコンパイルし、make installはコンパイルされたプログラムを適切な場所に配置する。SCWSのインストールが終わったら、いよいよZhparser自体のソースコードをgit cloneコマンドでダウンロードし、SCWSと同様にmake && make installでコンパイルしてインストールする。

Zhparserのインストールが完了したら、PostgreSQLにログインして設定を行う。psql -U postgresコマンドで管理者権限を持つユーザー「postgres」としてPostgreSQLサーバーに接続する。まず、CREATE EXTENSION zhparser;というコマンドを実行し、PostgreSQLにZhparser拡張機能を有効化させる。次に、CREATE TEXT SEARCH CONFIGURATION chinese (PARSER = zhparser);というコマンドで、「chinese」という名前の新しい全文検索設定を作成し、その設定でZhparserを中国語のテキストを解析するパーサーとして指定する。さらに、ALTER TEXT SEARCH CONFIGURATION chinese ADD MAPPING FOR n,v,a,i,e,l WITH simple;というコマンドで、特定の品詞(nは名詞、vは動詞、aは形容詞、iは成語、eは助詞、lは接尾辞などを指す)をどのように扱うかを設定する。ここではsimpleという方法、つまり単語の原型をそのまま利用するように指定している。最後にselect ts_token_type('zhparser');コマンドで、Zhparserが認識する品詞のリストを確認できる。

これらの設定が終われば、Zhparserを使った中国語全文検索のテストが可能になる。SELECT to_tsvector('chinese','人生得意须尽欢,莫使金樽空对月。天生我材必有用,千金散尽还复来。Hello world');というコマンドは、指定した中国語と英語の混じった文章を、先ほど設定した「chinese」という全文検索設定(Zhparser)を使って、検索に適した形(ベクトル)に変換する。この結果を見ると、「人生」「得意」「尽欢」のように、中国語の文章が意味のある単語に区切られていることがわかる。同時に、英語の「Hello」「world」も適切に認識されている。各単語の後ろにある数字は、文章中の単語の位置を示している。

次に、SELECT to_tsquery('chinese', '金风玉露一相逢,便胜却人间无数。It & works');というコマンドは、検索したいキーワードを含むクエリを作成する。ここでは「金风玉露」「相逢」「勝」「人間」といった中国語のキーワードと、「It」「works」という英語のキーワードが混在している。出力結果は、これらの単語が「<->」(フレーズ検索、単語の順番が重要)や「&」(AND検索)で結合され、どのように検索が行われるかを示している。たとえば、「金风玉露 <-> 相逢」は「金風玉露」の直後に「相逢」が続くフレーズを検索することを意味し、「it & works」は「it」と「works」の両方が含まれる文章を検索することを意味する。このように、Zhparserを使うことで、複雑な中国語の文章もPostgreSQLの全文検索機能で効率的に扱うことができるようになるのだ。