ICU境界分析を使用したPOSTGRESQLテキスト検索パーサー
全文検索の最初の段階は、ドキュメントとクエリのテキストを個々のトークン(明確な単語、数字など)に壊すことです。ただし、このタスクがそれほど些細なものではない言語があります。最も顕著な例は、東アジアの言語(中国語、日本、韓国語など)です。ここでは、言葉は一般的に白文学と句読点で区切られていません。別の例はヘブライ語です。単語は句読点で区切られていますが、一部の文字は、コンテキストに応じて句読点と見なされるか、そうでないと見なされる場合があります。
PostgreSQLの全文検索サブシステムに含まれるデフォルトのパーサーは、これらの場合にかなり不十分な結果を提供します。 pg_icu_parser 、ICUワード境界分析ルーチンを使用してソーステキストからトークンを抽出するカスタムフルテキスト検索パーサーの実装を提供する拡張機能です。これらは、Unicode標準の付録29で指定されたアルゴリズムを実装し、多くの言語で合理的な結果を提供できます。
現在、 pg_icu_parserソースコードから構築する必要があります。 PostgreSQL用の開発サポートファイル(ヘッダーなど)があることを確認してください。
構築してインストールするには、実行してください。
$ make install
これにより、現在のパスで見つかったpg_configの最初のインスタンスによって決定されたPostgreSQLインストールに対して構築され、インストールされます。特定のインストール(またはパスにないもの)をターゲットにするには:
$ make install PG_CONFIG=/path/to/pg_config
拡張機能はPGXNでも利用できます。
拡張機能をデータベースにロードするには、適切な権限を持つユーザーとして次のSQLコマンドを実行します。
CREATE EXTENSION pg_icu_parser;これにより、現在のスキーマにカスタムテキストパーサーが登録されます。それを利用するには、PostgreSQLマニュアルで説明されているように、テキスト検索構成を作成する必要があります。例えば:
CREATE TEXT SEARCH CONFIGURATION sample (parser = icu_parser);
ALTER TEXT SEARCH CONFIGURATION sample ADD MAPPING FOR word WITH english_stem;
ALTER TEXT SEARCH CONFIGURATION sample ADD MAPPING FOR number , ideo, kana WITH simple;パーサーによって放出できるトークンタイプは、 word 、 number 、 kana 、 ideo 、およびblankです。これらは、ICUでサポートされている単語ブレイクタグに沿っています。どの辞書を使用できるかに関する制限はありません。
pg_icu_parser 、単一の構成パラメーターを公開します。
pg_icu_parser.locale文字列、オプション。境界分析ルーチンで使用するICUロケール。設定されていない場合、デフォルトはenになります。通常、ロケールに敏感な単語境界検出ルールがないため、このパラメーターを設定する必要はありません。 上記のように、 pg_icu_parserの主な強度とPostgreSQLにすでに組み込まれているdefaultパーサーは、さまざまな言語でより良いトークン化結果です。さらに、 pg_icu_parser 、レターとは何かを決定するためのデータベースのロケール設定や基礎となるオペレーティングシステムに依存しません。
ただし、 pg_icu_parser特定のユースケースに適しているかどうかを決定に影響を与える可能性があることに注意すべきいくつかのトレードオフがあります。
デフォルトのパーサーは、URL、電子メールアドレス、さまざまな種類の数値値などを含むpg_icu_parserとして、さまざまなパターンを認識できます。
現時点では、 pg_icu_parser ts_headline関数をサポートしていません。多分将来...
pg_icu_parser 、 defaultパーサーよりもはるかに遅いです。ただし、データベースのサーバーエンコードがUTF-8の場合、高速パスが使用され、オーバーヘッドが減少します。以下のベンチマークセクションを参照してください。
サードパーティの拡張として、 pg_icu_parser 、PostgreSQLインストールの完全な制御が利用可能な場合にのみ使用できます。つまり、おそらく管理されたPostgreSQLソリューションでは使用できません。
以下の非科学的ベンチマークは、デフォルトのパーサーの代わりにpg_icu_parser使用することでどれほど遅くなると予想されるかという感覚を与えることができます。テストされたシナリオは、コーパス内の各ドキュメントの非ブランクトークンの数をカウントするためのクエリです。使用されているコーパスは、27,139の短いヘブライ語の記事で構成されるHaaretzコーパスです。値は、 EXPLAIN ANALYZEで報告されているように、10ラウンドのミリ秒単位での平均実行時間です。
| サーバーエンコーディング | default | pg_icu_parser | 減速する |
|---|---|---|---|
| UTF-8 | 2,566.9974 | 2,884.3696 | -12.3% |
| ISO-8859-8 | 3,529.6487 | 5,059.3616 | -43.3% |
もちろん、異なる環境と異なるコーパスには異なる結果が得られる場合があります。
pg_icu_parserは、Mozilla Public License 2.0に基づいてライセンスされています。