😮‍💨

日本人にはCockroachDBの全文検索は早すぎた

2023/11/20に公開

結論

現状(ver 23.1.12)CockroachDB Serverlessでは日本語辞書を指定できないため、日本語で全文検索はできなさそう。

CockroachDBとは?

postgresqlベースの比較的新しめな分散型のRDBMSです。

クラウドサービスとして提供されておりそちらを利用する上で全文検索を扱いたい機会があったため本記事を執筆しました。

https://www.cockroachlabs.com/

全文検索とは?

テキストの中から検索です。
よく「検索ボックスにキーワードを入れると記事を検索してくれる」みたいな機能を作る時に重宝するアレです。

SQLには昔から 列名 LIKE '%キーワード%' と指定することでその列にキーワードを含む行を探してくれる機能があります。しかしこちらはインデックスが効かず検索効率が悪いです。

LIKE句だとインデックスが効かないなど検索においては非効率
SELECT * FROM posts
WHERE cotnent LIKE '%postgres%'

そこでpostgresqlでは tsvector というデータ型が存在します。こちらと tsquery 型を組み合わせて使うことで効率の良い全文検索が可能になります。

SELECT * FROM posts
WHERE to_tsvector("english", content) @@ to_tsquery('english', 'postgres')

上記の例はcontent列を 'postgres' で検索するときの例です。

詳しくは以下を参照されたり。

  • 親切でわかりやすい記事

https://qiita.com/westhouse_k/items/a743efb66f0432345ccf

  • 日本語ドキュメント(ありがたい)

https://www.postgresql.jp/docs/9.0/datatype-textsearch.html

賢い tsvectortsquery

tsvector 型は第1引数で設定されたconfigurationをもとにテキストを検索しやすい形に変換します。例えば to_tsvector('english', 'I dont wanna write, or hold a mic, feedback stopped me .')

  1. 'english' というconfigurationに基づき(=テキストを英語と解釈して)
  2. 「I」「dont」「wanna」「,」「or」「hold」「a」「mic」「,」「feedback」「stopped」「me」「.」に分割し
  3. 意味ない文字列「,」「.」「a」...を削除し
  4. 単語の活用を原型にする。「wanna」は「want」に、「stopped」を「stop」に....

などの処理を行って検索しやすい形にします。(これを正規化というようです)

こうして正規化されたtsvectorをtsqueryで検索します。
tsqueryは &| などを使って複雑な条件を指定することが可能です。
to_tsquery('fat & rat') みたいな感じです。

詳しくはドキュメントを参照されたり。

https://www.postgresql.jp/docs/9.0/datatype-textsearch.html#DATATYPE-TSQUERY

このconfigurationはデフォルトで備わっているもの以外に関しては必要に応じて追加していかなければなりません。日本語はデフォルトでは備わっていないので自分で追加しないといけないようです。

本題:CockroachDBではどうするか?

PostgreSQLでの全文検索を抑えた上で、本題のCockroachDBでも同じようにできるのでしょうか?

ここに書いてありました。こんな記述があります。

The supported dictionaries are English, Danish, Dutch, Finnish, French, German, Hungarian, Italian, Norwegian, Portuguese, Russian, Spanish, Swedish, and Turkish. An additional simple dictionary does not perform stemming or stopwording when normalizing documents or queries.

サポートされる辞書は、英語、デンマーク語、オランダ語、フィンランド語、フランス語、ドイツ語、ハンガリー 語、イタリア語、ノルウェー語、ポルトガル語、ロシア語、スペイン語、スウェーデン語、トルコ語です。追加の単純な辞書は、文書またはクエリを正規化する際に、ステミングやストップワードは行いません。
https://www.cockroachlabs.com/docs/v23.1/full-text-search#text-search-configuration

ほう。日本語がないがな。ではconfigurationを追加したい場合はどうするんだろうとドキュメントを読み進めると...

Unsupported features

Some PostgreSQL syntax and features are unsupported. These include, but are not limited to:

Aspects of text search configurations other than the specified dictionary.

サポートされていない機能

PostgreSQLの構文や機能の中にはサポートされていないものがあります。これらに限定されるものではありません:

指定された辞書以外のテキスト検索構成の側面。

日本語は指定されてなかったので使えません!が結論 になります。

うーーん。残念。


そもそも全文検索周りの実装が追いついたのも23.1に入ってからのことらしく(執筆時点では23.1.12)、今後の機能追加に期待と言うところで今回の調査は終了しました。ガンバッテオボエタブンカエセ

卒業研究の中では検索機能はメインとなる部分ではなかったのでてきとうに分かち書きして適当なテーブルに突っ込んでおくか '%' 使ってしまおうかと思います(雑)

めがね〜ず

Discussion