アーカイブ「2018年12月」

MariaDBにMroongaはバンドルされていますが、

TokenizerとしてMecabを使う際は、少し注意が必要です。

公式には、以下のように書かれていますが、手順を残しておきます。

https://mariadb.com/kb/en/library/mroonga-overview/

「Tokenise using MeCab. Required Groonga to be buillt with MeCab support.」

なお、OSはCentOS7、MariaDBのバージョンは、10.3.8です。


まずは、バンドルされているMroongaのインストールを見ていきます。

公式(https://mariadb.com/kb/en/library/about-mroonga/)を参考にしています。

1.プラグインのインストール

MariaDB [(none)]> INSTALL SONAME 'ha_mroonga';

2.Mroongaのインストール確認

MariaDB [(none)]> show engines;
+--------------------+---------+-----------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                 | Transactions | XA   | Savepoints |
+--------------------+---------+-----------------------------------------+--------------+------+------------+
| CSV                | YES     | Stores tables as CSV files              | NO           | NO   | NO         |
:(省略)
| Mroonga            | YES     | CJK-ready fulltext search, column store | NO           | NO   | NO         |
:(省略)
+--------------------+---------+-----------------------------------------+--------------+------+------------+

3.UDFの作成

公式(https://mariadb.com/kb/en/library/creating-mroonga-user-defined-functions/)より引用。

4.プラグインの確認

MariaDB [(none)]> show plugins;
+-------------------------------+----------+--------------------+---------------+---------+
| Name                          | Status   | Type               | Library       | License |
+-------------------------------+----------+--------------------+---------------+---------+
| binlog                        | ACTIVE   | STORAGE ENGINE     | NULL          | GPL     |
:(省略)
| Mroonga                       | ACTIVE   | STORAGE ENGINE     | ha_mroonga.so | GPL     |
| Mroonga_stats                 | ACTIVE   | INFORMATION SCHEMA | ha_mroonga.so | GPL     |
+-------------------------------+----------+--------------------+---------------+---------+

5.Tokenizerの確認

MariaDB [(none)]> select json_detailed(mroonga_command("tokenize TokenBigram '東京都'"));
+----------------------------------------------------------------+
| json_detailed(mroonga_command("tokenize TokenBigram '東京都'")) |
+----------------------------------------------------------------+
| [
    {
        "value": "東京",
        "position": 0,
        "force_prefix": false
    },
    {
        "value": "京都",
        "position": 1,
        "force_prefix": false
    },
    {
        "value": "都",
        "position": 2,
        "force_prefix": false
    }
]      |
+----------------------------------------------------------------+
MariaDB [(none)]> select json_detailed(mroonga_command("tokenize TokenMecab '東京都'"));
ERROR 1026 (HY000): [tokenize] nonexistent tokenizer 

TokenBigramは使えるが、TokenMecabは使えない。。。

このように、公式にバンドルされているMroongaではMecabが使えないので、

Groongaレポジトリから取得するMroongaを使うには、

一旦削除しておく必要があります。

MariaDB [(none)]> UNINSTALL SONAME 'ha_mroonga';

ここからGroongaレポジトリからもろもろ取得し、設定していきます。

主な設定方法は、以下の公式ページに記載されています。

http://mroonga.org/ja/docs/install/centos.html#centos-7-with-mariadb-10-3-package

1.レポジトリのインストール

# yum install -y https://packages.groonga.org/centos/groonga-release-latest.noarch.rpm

2.Mroonga関連インストール

# yum install -y --enablerepo=epel mecab mecab-devel groonga groonga-tokenizer-mecab mariadb-10.3-mroonga

※依存関係により、この時点でMariaDB-Serverのバージョンが上がる可能性あるため、mysql_upgradeを適宜実行する。

3.Mecabの確認

$ mecab -D
filename:    /usr/lib64/mecab/dic/ipadic/sys.dic
version:    102
charset:    utf8
type:    0
size:    392126
left size:    1316
right size:    131
$ echo '東京都' | mecab
東京    名詞,固有名詞,地域,一般,,,東京,トウキョウ,トーキョー
都    名詞,接尾,地域,,,*,都,ト,ト
EOS

4.Groongaの確認

$ groonga --version | head -1
Groonga 8.0.9 [linux-gnu,x86_64,utf8,match-escalation-threshold=0,nfkc,mecab,msgpack,mruby,onigmo,zlib,lz4,zstd,epoll]

ここまでで、Mecabが無事動作し、Groongaからも認識されていればOK。

5.Mroongaプラグインをインストール

MariaDB [(none)]> source /usr/share/mroonga/install.sql;

上記コマンドで、Groonga提供のMroongaライブラリがインストールされ、UDFも上書きされます。

6.プラグインの状態確認

MariaDB [(none)]> show plugins;
+-------------------------------+----------+--------------------+------------------------+---------+
| Name                          | Status   | Type               | Library                | License |
+-------------------------------+----------+--------------------+------------------------+---------+
| binlog                        | ACTIVE   | STORAGE ENGINE     | NULL                   | GPL     |
:
| Mroonga                       | ACTIVE   | STORAGE ENGINE     | ha_mroonga_official.so | GPL     |
+-------------------------------+----------+--------------------+------------------------+---------+

お、共有ライブラリの名称が「ha_mroonga.so」から「ha_mroonga_official.so」に変わっていますね。

7.Mecabの実行確認

MariaDB [(none)]> select json_detailed(mroonga_command("tokenize TokenMecab '東京都'"));
+---------------------------------------------------------------+
| json_detailed(mroonga_command("tokenize TokenMecab '東京都'")) |
+---------------------------------------------------------------+
| [
    {
        "value": "東京",
        "position": 0,
        "force_prefix": false,
        "force_prefix_search": false
    },
    {
        "value": "都",
        "position": 1,
        "force_prefix": false,
        "force_prefix_search": false
    }
]    |
+---------------------------------------------------------------+

おおー、無事にMariaDBからMecabを使えるようになりました。

長くなりましたが、以上です。


投稿日時:2018年12月14日 16:28   カテゴリー:mariadb   [コメントがあればどうぞ]

MariaDB10.3系で導入されたsequence(nextvalの方)において、

ほかテーブルのdefault値として設定できるようです。

確認したバージョンは、10.3.8です。


最初にsequenceを作ります。

MariaDB [test]> create sequence s_user increment by 0;

このとき、galeraなど使う際、問題ないように「increment by 0」をつけておきます。

ちなみに、このときのsequence関連のパラメータは以下の通りなので、

「increment by 0」をつけても、1ずつインクリメントされます。

MariaDB [test]> show variables like 'auto_increment%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| auto_increment_increment | 1     |
| auto_increment_offset    | 1     |
+--------------------------+-------

次に以下のようなテーブルを作成します。

MariaDB [test]> create table t_user (
  user_id int not null,
  name varchar(32) not null,
  seq_no bigint not null unique default nextval(s_user),
  primary key (user_id)
);

上記テーブルにおいて、seq_noカラムのdefault値にsequenceの結果を設定したので、以下のようなinsertにて、nextvalの結果が格納されます。

MariaDB [test]> insert into t_user (user_id, name) values (1, 'name01');
MariaDB [test]> insert into t_user (user_id, name) values (2, 'name02');
MariaDB [test]> insert into t_user (user_id, name) values (3, 'name03');
MariaDB [test]> insert into t_user (user_id, name) values (11, 'name11');
MariaDB [test]> insert into t_user (user_id, name) values (12, 'name12');
MariaDB [test]> insert into t_user (user_id, name) values (13, 'name13');

MariaDB [test]> select * from t_user;
+---------+--------+--------+
| user_id | name   | seq_no |
+---------+--------+--------+
|       1 | name01 |      1 |
|       2 | name02 |      2 |
|       3 | name03 |      3 |
|      11 | name11 |      4 |
|      12 | name12 |      5 |
|      13 | name13 |      6 |
+---------+--------+--------+


sequenceが導入されてから、見落としていたのですが、なにげにこれは嬉しい。

公式にもこっそり書いてありました。

https://mariadb.com/kb/en/library/sequence-overview/

PERSISTENTタイプの生成カラムで設定できたら、変更不能な連番を作り出せたので、それがあっても良かったのかなと少し思います。(とはいえ変更不能も困るか。。)

なお、sequenceの上限は、

9223372036854775806

で、javaなどのlong型の限界値

9223372036854775807

より-1したものとなっています。

以上


投稿日時:2018年12月14日 14:42   カテゴリー:mariadb   [コメントがあればどうぞ]