PGroongaのDockerイメージを作成できるDockerfileを,GitHubおよびDockerHubに公開しました.URLはそれぞれ以下のとおりです.
このイメージには,以下のソフトウェアを収録しています.Groonga 7.1.1は,昨日(2018年1月の肉の日),リリースされたばかりです.
- PGroonga 2.0.2
- Groonga 7.1.1
- MeCab 0.996 + IPADIC 2.7.0-20070801
- PostgreSQL 9.6 / Alpine Linux
以下のいずれかで,イメージtakehiko/pgroonga:latestが作られます.イメージのサイズは288MBです.
$ docker pull takehiko/pgroonga
$ git clone https://github.com/takehiko/docker-pgroonga.git $ cd docker-pgroonga $ docker build -t takehiko/pgroonga .
このDockerイメージで,MeCabベースのトークナイザーが利用できることを確認します.まずはコンテナを起動し,データベースpgtestとテーブルdiaries*1を作成して,1件だけレコード*2を入れます.
$ docker run --rm -d -p 45432:5432 --name pgr takehiko/pgroonga $ alias pgr="psql -h 127.0.0.1 -p 45432 -U postgres" $ pgr -c "CREATE DATABASE pgtest ENCODING 'UTF8'" $ alias pgr="psql -h 127.0.0.1 -p 45432 -U postgres -d pgtest" $ pgr -c "CREATE EXTENSION pgroonga" $ pgr -c "CREATE TABLE diaries (\ diary_id serial PRIMARY KEY,\ uri text NOT NULL,\ title text NOT NULL)" $ pgr -c "CREATE INDEX diary_title_pgidx \ ON diaries USING pgroonga (title) WITH (tokenizer='TokenMecab')" $ pgr -c "INSERT INTO diaries(uri, title) \ VALUES('http://d.hatena.ne.jp/takehikom/20170317/1489702050',\ 'Windows 10アップデート後にはregedit〜0.5秒後にフォーカス,CpasLockはCtrlに')"
CREATE INDEXの書き方はCREATE INDEX USING pgroonga | PGroongaを参照しました.
では,検索を行います.
$ pgr -c "SELECT * FROM diaries WHERE title &@ 'フォーカス'" | cat diary_id | uri | title ----------+-----------------------------------------------------+---------------------------------------------------------------------------- 1 | http://d.hatena.ne.jp/takehikom/20170317/1489702050 | Windows 10アップデート後にはregedit〜0.5秒後にフォーカス,CpasLockはCtrlに (1 row) $ pgr -c "SELECT * FROM diaries WHERE title &@ 'カス'" | cat diary_id | uri | title ----------+-----+------- (0 rows)
先に検索したほうは,titleに「フォーカス」を含むものを見つけよという問い合わせで,きちんと,格納したレコードが得られました.次に,titleに「カス」を含むものを見つけなさいと問い合わせたところ,結果は「0 rows」でした.MeCabベースのトークナイザーが機能し,「フォーカス」が1つの単語として扱われていると推測できます.
MeCabベースでない(bigramベースの)トークナイザーも,動作確認しておきましょう.
$ docker stop pgr
$ docker run --rm -d -p 45432:5432 --name pgr takehiko/pgroonga $ alias pgr="psql -h 127.0.0.1 -p 45432 -U postgres" $ pgr -c "CREATE DATABASE pgtest ENCODING 'UTF8'" $ alias pgr="psql -h 127.0.0.1 -p 45432 -U postgres -d pgtest" $ pgr -c "CREATE EXTENSION pgroonga" $ pgr -c "CREATE TABLE diaries (\ diary_id serial PRIMARY KEY,\ uri text NOT NULL,\ title text NOT NULL)" $ pgr -c "CREATE INDEX diary_title_pgidx ON diaries USING pgroonga (title)" $ pgr -c "INSERT INTO diaries(uri, title) \ VALUES('http://d.hatena.ne.jp/takehikom/20170317/1489702050',\ 'Windows 10アップデート後にはregedit〜0.5秒後にフォーカス,CpasLockはCtrlに')"
$ pgr -c "SELECT * FROM diaries WHERE title &@ 'フォーカス'" | cat diary_id | uri | title ----------+-----------------------------------------------------+---------------------------------------------------------------------------- 1 | http://d.hatena.ne.jp/takehikom/20170317/1489702050 | Windows 10アップデート後にはregedit〜0.5秒後にフォーカス,CpasLockはCtrlに (1 row) $ pgr -c "SELECT * FROM diaries WHERE title &@ 'カス'" | cat diary_id | uri | title ----------+-----------------------------------------------------+---------------------------------------------------------------------------- 1 | http://d.hatena.ne.jp/takehikom/20170317/1489702050 | Windows 10アップデート後にはregedit〜0.5秒後にフォーカス,CpasLockはCtrlに (1 row) $ docker stop pgr $ unalias pgr
こちらは同じ結果です.検索語を「フォーカス」にしても,「カス」にしても,titleの文字列に含まれているので,格納したレコードが返ってきたのでした.
Dockerfileは,愚鈍に,MeCabとIPA辞書,Groonga,PGroongaの順にビルドしてmake installするよう,記述しています.g++やmakeなどのソフトウェアと,httpsから始まるURLにアクセスするためのSSL関連は,「RUN apk add --update --no-cache build-base openssl」でインストールしています.
クリーンアップにおいて,build-baseはアンインストールしていません.してしまうと,SQL文の「CREATE EXTENSION pgroonga」を実行したときに,以下のエラーメッセージが出るためです.
ERROR: could not load library "/usr/local/lib/postgresql/pgroonga.so": Error loading shared library libstdc++.so.6: No such file or directory (needed by /usr/local/lib/libgroonga.so.0)
iquiw/pgroonga-on-postgres - Docker HubとAlpine LinuxでMeCab with NEologd - Qiitaは,先行事例として何度も何度も読みました.当ブログでのDocker紹介記事には,getvba: VBAマクロ取得のWebインタフェースとDockerとNode.jsで「Hello, world!」のWebサーバがあります.