わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

DockerでPGroonga

PGroongaのDockerイメージを作成できるDockerfileを,GitHubおよびDockerHubに公開しました.URLはそれぞれ以下のとおりです.

このイメージには,以下のソフトウェアを収録しています.Groonga 7.1.1は,昨日(2018年1月の肉の日),リリースされたばかりです.

以下のいずれかで,イメージ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は,愚鈍に,MeCabIPA辞書,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 HubAlpine LinuxでMeCab with NEologd - Qiitaは,先行事例として何度も何度も読みました.当ブログでのDocker紹介記事には,getvba: VBAマクロ取得のWebインタフェースDockerとNode.jsで「Hello, world!」のWebサーバがあります.

*1:日記がいくつもあるみたいです.articlesのほうが良かったのですが,実際にdiariesで動作確認をしたので,このままにしておきます.

*2:本記事執筆に先立ち,当ブログのcomputingカテゴリの記事386件について,uriとtitleを抽出してINSERT文に変換し,データベースを作ってみたのでした.