Groongaのノーマライザーについてお勉強中の児玉です。
先日、Groongaのノーマライザーに新しい機能を追加しました。その際、最初はどのように進めるべきか悩みました。 そこで、ノーマライザーに機能を追加したいと考えている方へ、私が学んだことをもとに機能追加の方針を紹介します!
Groonga開発者に聞け!(グルカイ!)第68回でも解説しているので、あわせてご覧ください!
この記事では、文字レベルの正規化を対象としたノーマライザーの機能追加に焦点を当てていきます。 文字レベルの正規化とは、大文字と小文字を同一視したり、ひらがなとカタカナを同一視したりするような文字処理による正規化を指しています。 ただし、ノーマライザーには、より複雑なケースに対応できるように機能追加をする場合もあります。 たとえば、HTMLからテキストを抽出したり、JSONから情報を抽出したりするような、データ構造を理解した上での正規化が必要になるような機能をノーマライザーとして実装するケースです。 これらのケースについても軽く触れますが、この記事では詳しくは触れず、主に文字レベルの正規化を対象とした機能をノーマライザーに追加する際の方針を中心に説明します。
結論
忙しい方のために、結論から言うと、Groongaのノーマライザーに文字レベルの正規化をする新しい機能を追加する場合は、 既存ノーマライザーにオプションを追加する方針をオススメします!
それでは、他にどんな方針があるのか、なぜオプションを追加する方針が良いのかについて説明します。
ノーマライザーに機能追加する方法
Groongaのノーマライザーに機能を追加する場合、次の2つの方針があります。それぞれの方針について紹介します。
- 新規ノーマライザーを追加する
- 既存ノーマライザーを拡張する
新規ノーマライザーの追加
結論: 文字レベルの正規化の場合は基本的には避けるべきですが、そうでない場合は適切なことがあります。
新規ノーマライザーの追加は、既存ノーマライザーでは対応できない特定のユースケースに対して、一から実装する方針です。 具体的には、特定の形式やルールにしたがったデータ構造に対して正規化をおこなう機能を実装するケースです。 NormalizerHTMLのようにHTMLからテキストを抽出するためのノーマライザーがその一例です。
メリット
- 既存ノーマライザーの後方互換性を気にせずに、新規ノーマライザーを実装できる
デメリット
- 命名から設計まで一から考える必要があり実装コストがかかる
- 純粋にノーマライザーが増えるためメンテナンスコストがあがる
- ノーマライザーの数が増えるため、ユーザーがどのノーマライザーを選択するべきか判断するコストが増える
デメリットを考慮しても、既存ノーマライザーでは対応できない特殊なユースケースがある場合は新規ノーマライザーを実装する方針が適しています。 しかし、文字レベルの正規化をする機能を追加する場合は、後述する既存ノーマライザーにオプションを追加する方針がより適しているため、 新規ノーマライザーを追加するケースはほとんどありません。
既存ノーマライザーの拡張
既存ノーマライザーを拡張する方法には、次の2つの方針があります。それぞれについて紹介します。
- 既存ノーマライザーのロジックを変更する
- オプションを追加して機能を拡張する
既存ノーマライザーのロジックを変更する
結論: 基本的には選択されない方針です。
こちらの方針は、文字通り既存のロジックを変更することで機能を追加する方針になります。
メリット
- 既存ノーマライザーを変更するためシンプルな変更に留められる
- ノーマライザーは増えないので、ユーザーがどのノーマライザーを選択するべきか判断するコストが増えない
デメリット
- 既存ノーマライザーのロジックを変更するため、後方互換性が壊れる
- 互換性が壊れることによりバージョンアップ時にインデックスの再構築が必要になり、ユーザーのメンテナンスコストが増加する
一見良さそうに見えますが、Groongaではこちらの方針は取りません。 なぜなら、互換性が壊れるとユーザーのコストがあがって大変なためです。
既存ノーマライザーにオプションを追加する
結論: 推奨されるもっとも柔軟に対応できる方針です。
こちらの方針は、Groongaの既存ノーマライザーにオプションを追加することで、 新規に追加する機能を利用するか否かを選べるようにする方針です。
メリット
- 既存ノーマライザーの挙動を変更せずに機能追加ができるため、後方互換性を維持できる
- オプションで機能の利用を制御できるため、柔軟にノーマライザーの機能を選択できる
デメリット
- ユーザーは複数のオプションからユースケースにあったものを選択する必要があり判断するコストがかかる
- 複数オプションを指定した際に挙動の整合性を取る必要があり実装のコストが少し上がる
基本的には、後方互換性を大事にするGroongaでは、最後に紹介したこちらの「既存ノーマライザーにオプションを追加する」方針で対応することが多いです! 実際に追加されたオプションの例は、ノーマライザーのオプション一覧で確認できます。
まとめ
今回の記事では、ノーマライザーの機能追加でとりうる方針について紹介しました。 Groongaのノーマライザーに機能追加をしてみたいと思った方は、方針を決める際に是非参考にしてください。
また、特定のユースケースに合わせてノーマライザーのカスタマイズが必要な場合や、機能追加についてご相談がある方は、 こちらのお問い合わせからお気軽にご連絡ください。