元々は、(GitLab CEと一緒にyumパッケージ管理したいので)どうすればMattermostのソースコードを変更せずに日本語検索対応できるのだろう、というのが考え始めたきっかけです。
最初考えたのは、MySQLと同様(Issue #2033)N-gram indexを張れば良いのでは、というものですが、
- PostgreSQLではそもそもindexが使用されていない(Issue #2622)
- PostgreSQLでの N-gram 検索は 照合演算子(
@@
) ではなくLIKE
を使用する
ためソース変更しない前提では不可能であることが分かりました。
そこで、次に考えたのが形態素解析による検索で、これはtextsearch_jaとMeCabを使うことで実現できましたのでIssue #2159にFYIとして記載しました。
以上が経緯になります。
個人的にはいいと思うんですが、N-gramって日本語以外のマルチバイト文字列でも使えるはずなので、その辺も考慮できればよりいいんじゃないでしょうか。
最終的に本体に取り込んでもらえるのであれば、私もN-gram検索できるよう変更するのが望ましいと思います。(ググった限り、textsearch_ja & MeCab 方式はちょっとレガシーみたいですし…)
ただ、英語圏の人にとってはN-gramのLIKE
検索は使い勝手が悪いと思うので、現在の@@
検索とどちらを使うか選択できるようになっていなければならないのでは、とも思います。
(以下、N-gramの話は置いておいて、@@
検索について)
私が現在理解している範囲においては、理想的には、暗黙的に使用されるdefault_text_search_config
設定に依存すべきでなく、すべてのto_tsvector
に対して明示的にregconfig
パラメータ('english'
や'japanese'
)が指定されるべきであると考えています。
なぜなら、regconfig
を明示しない場合にはIndex ScanされずSeq Scanで実行されるため、パフォーマンス上の懸念となるためです。
(注: 実際どの程度パフォーマンスに差異があるのか計測したわけではなく、まあそうなんだろうなあ、という想像で書いています。)
ただし、ハードコーディングすると多言語化の妨げになるため、外部設定できるのが望ましいと考えます。
つまり、私が望ましいと考えるのはB案ということになります。
以下補足ですが、A案に書かれている
to_tsvector('english', MESSAGE)を to_tsvector(MESSAGE) に変更
については、すみません、説明が下手なせいで誤解を招いてしまっているようです。CREATE INDEX
時にはto_tsvector
へのregconfig
パラメータ指定は必須です。無ければエラーになります。
(仮に実行時の言語指定によって挙動を変えられるようにするとなると、都度index再作成が必要になりますからね…)
ただしこの部分は、ハードコーディングされていたとしても、MySQLと同様にユーザ自身がindexを張り直すことはできるのであまり深刻では無いと考えます。
「A案だと他のpostgresを利用しているソフトウェア(e.g. GitLab)にも影響する可能性があるので、B案が良い」
regconfig
を明示せずdefault_text_search_config
を利用する実装になっているとindexが働かないため修正すべきでは、というのが意図になります。
(GitLabにも影響しそうだからdefault_text_search_config
変更を避けたい、というのも多少はあるのですが、まあそれはMattarmost側からしたら知ったこっちゃないですよね…)