Ludia functionsは、文字列の正規化関数とスニペット作成関数を提供するモジュールです。それらの関数は全文検索モジュールLudiaが提供していたものと同じです。 Ludia functionsは、それらの関数をPostgreSQL9.1以降で利用可能にしています。
Ludia functionsプロジェクトでは以下2つのモジュールを提供します。
モジュール名 | 概要 | ソースアーカイブファイル名 |
---|---|---|
Ludia functions | 文字列の正規化関数とスニペット作成関数を提供するモジュール | ludia_funcs-x.y-YYYYMMDD.tar.gz |
senna-1.1.2-fast | 組み込み型全文検索エンジンSennaの性能改善版 | senna-1.1.2-fast-YYYYMMDD.tar.gz |
ソースアーカイブファイル名のx.yとYYYYMMDDの部分は、それぞれ、そのファイルのバージョン番号とリリース年月日です。例えば、2015年9月10日リリースのバージョン1.0のファイルでは、x.yは1.0、YYYYMMDDは20150910です。
各提供モジュールのライセンスはLGPLv2.1です。
Ludia functionsは、提供モジュールの一つである性能改善版のSennaと組み合わせて使うことで、Ludia同様に文字列の正規化やスニペット作成を行います。
Ludia functionsは、様々な形式のファイルからテキストを抽出する関数も提供します。この関数を利用するには、商用ソフトウェアのTextPorterを別途購入する必要があります。 (TextPorter Ver.5 Copyright(c) 1999- Antenna House, Inc.)
Ludia functionsは、以下の環境で動作確認しています。
カテゴリ | モジュール名 |
---|---|
OS | Linux, Mac OS X |
DMBMS | PostgresSQL 9.1, 9.2, 9.3, 9.4, 9.5, 9.6, 10, 11, 12 |
Senna | senna-1.1.2-fast |
Ludia functionsは、PostgreSQL9.1以降に対応しています。 9.0以前には未対応です。
Ludia functionsは、オリジナルのSenna1.1.2以降とも組み合わせ可能だと思われますが、動作確認していません。 senna-1.1.2-fastを使う場合、Ludia functionsの登録先のデータベースでは、エンコーディングはUTF-8でなければなりません。
PostgreSQLのオフィシャルサイトからバージョンX.Y.Z(X.Y.Zは実際のバージョン数字に置き換えてください)のソースアーカイブファイル(postgresql-X.Y.Z.tar.gz)をダウンロードし、ビルドとインストールを行います。
$ tar zxf postgresql-X.Y.Z.tar.gz $ cd postgresql-X.Y.Z $ ./configure --prefix=/opt/pgsql-X.Y.Z $ make $ su # make install # exit
上記手順ではソースコードからPostgreSQLをインストールしています。しかし、RPMなどの他の手順でPostgreSQLをインストールしてもLudia functionsは利用可能です。 RPMインストールのPostgreSQLでLudia functionsを利用するには、postgresql-develパッケージをインストールしなければならないことに注意してください。
ここからsenna-1.1.2-fastのソースアーカイブファイルをダウンロードし、ビルドとインストールを行います。 Sennaのmakeには長時間かかることに注意してください。
$ tar zxf senna-1.1.2-fast-YYYYMMDD.tar.gz $ cd senna-1.1.2-fast-YYYYMMDD $ ./configure --prefix=/opt/senna-1.1.2-fast --without-mecab $ make $ su # make install # exit
ここからLudia functionsのソースアーカイブファイルをダウンロードし、ビルドとインストールを行います。
$ tar zxf ludia_funcs-x.y-YYYYMMDD.tar.gz $ cd ludia_funcs-x.y-YYYYMMDD $ make USE_PGXS=1 PG_CONFIG=/opt/pgsql-X.Y.Z/bin/pg_config SENNA_CFG=/opt/senna-1.1.2-fast/bin/senna-cfg $ su # make USE_PGXS=1 PG_CONFIG=/opt/pgsql-X.Y.Z/bin/pg_config SENNA_CFG=/opt/senna-1.1.2-fast/bin/senna-cfg install # exit
データベースクラスタの作成後、postgresql.confを編集、PostgreSQLを起動し、Ludia functionsをデータベースに登録します。
$ initdb -D $PGDATA --locale=C --encoding=UTF8 $ vi $PGDATA/postgresql.conf shared_preload_libraries = 'ludia_funcs' custom_variable_classes = 'ludia_funcs' $ pg_ctl -D $PGDATA start $ psql -d <データベース名> =# CREATE EXTENSION ludia_funcs; =# \dx ludia_funcs List of installed extensions Name | Version | Schema | Description -------------+---------+--------+----------------- ludia_funcs | 1.0 | public | ludia functions (1 row)
Ludia functionsのインストールは以上で終わりです。
Ludia functionsについて、データベースからの登録解除とアンインストールを行います。
$ psql -d <データベース名> =# DROP EXTENSION ludia_funcs CASCADE; =# \q $ pg_ctl -D $PGDATA stop $ su # cd <ludia_funcsのソースディレクトリ> # make USE_PGXS=1 PG_CONFIG=/opt/pgsql-X.Y.Z/bin/pg_config SENNA_CFG=/opt/senna-1.1.2-fast/bin/senna-cfg uninstall # exit
postgresql.confの以下の設定を削除します。
senna-1.1.2-fastのソースディレクトリでアンインストールを行います。
$ su # cd <senna-1.1.2-fastのソースディレクトリ> # make uninstall # exit
pgs2normは、文字列正規化ルール(NFKCの正規化形式)に則って、文字列(引数1)を正規化する関数です。
引数1がNULLの場合、戻り値はNULLです。
NFKCの正規化では、例えば、以下のように文字列を変換します。
実行例
=# SELECT pgs2norm('いロハAbCd12③Ⅳ㈱'); pgs2norm --------------------- いロハabcd123iv(株) (1 row)
pgs2normは、引数と戻り値の文字列をメモリ上にキャッシュします。そして、pgs2normの次回実行時に引数の文字列がキャッシュされているものと同じであれば、正規化処理を行わず、キャッシュされている戻り値を直接返却することで、処理を高速化します。 pgs2normは、引数と戻り値をキャッシュする際、前回までのキャッシュを破棄します。つまり、キャッシュできる引数と戻り値は直前実行分の一組だけです。キャッシュはセッション単位で行われます。他セッションのキャッシュを、別セッションから実行されたpgs2normで使うことはできません。 pgs2normのキャッシュサイズの上限は、パラメータludia_funcs.norm_cache_limitで指定できます。
pgs2snippet1は、文字列(引数8)からキーワード(引数7)のスニペット(KWIC)を作成する関数です。
NULLの引数がある場合、戻り値はNULLです。
実行例
=# SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, 'PostgreSQL', '最近、PostgreSQLの利用者が増えています。'); pgs2snippet1 ---------------------------- 最近、★PostgreSQL★の利用者 (1 row)
pgs2snippet1では、キーワード(引数7)に複数の文字列を指定できます。複数指定するには、各文字列を"(半角ダブルクォート)で囲み、それらを+(半角プラス)でつなげます。
実行例
=# SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, '"PostgreSQL"+"HINT"', 'pg_hint_planは、PostgreSQLでHINT句を使えるようにするツールです。'); pgs2snippet1 ------------------------------------- ★hint★_planは、★PostgreSQL★で★HINT★ (1 row)
キーワード内の"と\は、pgs2snippet1ではメタ文字("は検索文字列の区切り文字、\はエスケープ文字)として解釈されます。 "と\を文字そのものとして解釈させるには、それらを\でエスケープしなければなりません。
実行例
=# SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, '"\"2-gram\""', 'pg_bigmは、PostgreSQLで"2-gram"の全文検索を使えるようにするツールです。'); pgs2snippet1 ------------------------------- ostgreSQLで★"2-gram"★の全文検 (1 row)
このエスケープ処理は、ludia_funcs.escape_snippet_keywordを有効にすることでpgs2snippet1に任せることもできます。
pgs2seninfoは、Ludia functionsが利用しているSennaのバージョン情報を表示する関数です。
実行例
=# SELECT * FROM pgs2seninfo(); version | configure_options ---------------------------------+------------------------------------------------- 1.1.2 (last update: 2013.04.05) | '--without-mecab' '--prefix=/senna-1.1.2-fast/'
ludia_funcs.last_updateは、Ludia functionsモジュールの最終更新日付を報告するパラメータです。このパラメータは読み取り専用です。 postgresql.confやSET文で設定値を変更することはできません。
実行例
=# SHOW ludia_funcs.last_update ; ludia_funcs.last_update ------------------------- 2013.04.05 (1 row)
ludia_funcs.norm_cache_limitは、pgs2normが確保するキャッシュの上限サイズを指定するパラメータです。設定値はkB単位で指定します。設定値の範囲は -1 ~ 2TB-1B です。設定値-1(デフォルト値)は、キャッシュサイズ上限としてパラメータwork_memの設定値を使うことを意味します。設定値0は、キャッシュサイズの上限がない(常にキャッシュする)ことを意味します。このパラメータは、postgresql.confとSET文(スーパーユーザに限らずどのユーザからでも)で設定値を変更できます。
ludia_funcs.escape_snippet_keywordは、pgs2snippet1のキーワード(引数7)内の"(半角ダブルクォート)と\(半角バックスラッシュ)をエスケープするかどうか指定するパラメータです。デフォルト値はoffで、エスケープしません。
キーワード内の"と\は、pgs2snippet1ではメタ文字("は検索文字列の区切り文字、\はエスケープ文字)として解釈されます。 "と\を文字そのものとして解釈させるには、それらを\でエスケープしなければなりません。このパラメータを有効にすると、pgs2snippet1は、文字として解釈させたい"と\を自動的にエスケープします。このようなエスケープ処理をクライアントアプリケーション側で実装済の場合は、このパラメータは無効で構いません。
このパラメータは、postgresql.confとSET文(スーパーユーザに限らずどのユーザからでも)で設定値を変更できます。
pgs2snippet1に記述されている最後の実行例のSQLは、escape_snippet_keywordを使うことで、以下のように書き換えられます。
実行例
=# SHOW ludia_funcs.escape_snippet_keyword ; ludia_funcs.escape_snippet_keyword ------------------------------------ off (1 row) =# SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, '""2-gram""', 'pg_bigmは、PostgreSQLで"2-gram"の全文検索を使えるようにするツールです。'); pgs2snippet1 -------------- (null) (1 row) =# SET ludia_funcs.escape_snippet_keyword TO on; =# SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, '""2-gram""', 'pg_bigmは、PostgreSQLで"2-gram"の全文検索を使えるようにするツールです。'); pgs2snippet1 ------------------------------- ostgreSQLで★"2-gram"★の全文検 (1 row)