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サーバがあります.