Sonicは、少ないメモリで動く高速なスキーマレス検索バックエンドです。テキストと識別子のペアを取り込み、検索クエリに対してIDを高速に返します。Elasticsearchのような重い全文検索エンジンの軽量な代替として設計されており、実際にCrispの検索機能で数億件規模のデータに使われています。
Sonicは「Sonic Channel」という独自のシンプルなテキストプロトコルでTCP接続を受け付け、search・ingest・controlの3モードでコマンドを処理します。core/src/executor以下にPUSH・POP・QUERY・SUGGEST・FLUSHなどのコマンド処理が実装されており、core/src/lexerで言語判定・ストップワード除去・語幹化(stemming)を行ってからテキストを正規化します。索引データはcore/src/storeのkv(キーバリュー)とfst(有限状態変換器)という2種類のストアに保存され、fstが単語の補完や曖昧一致・タイポ訂正を支える語グラフの役割を果たします。バケット(bucket)とコレクション(collection)という単位でデータを分離管理でき、バックグラウンドのconsolidateタスクが挿入・削除を索引に反映します。公式クライアントはclient/以下にRustで実装されており、mio(非同期I/O)とcrossbeam-channelを使ったコネクション多重化(multiplexer)でコマンドをパイプライン処理します。
- STEP 01
リリースページからバイナリを取得するか cargo build --release でビルドし、config.cfg を用意して sonic を起動すると、1491番ポートで待ち受け開始のログが表示されます。
- STEP 02
telnetやncでポート1491に接続すると「CONNECTED」の行が返り、続けて「START ingest パスワード」のように送るとチャンネルが開始されたことを示す「STARTED」応答が来ます。
- STEP 03
PUSH コレクション バケット オブジェクトID テキスト、という形式でテキストを投入すると「OK」が即座に返り、裏でconsolidateタスクが索引を更新していく様子が確認できます。
- STEP 04
search モードに切り替えてQUERY コレクション バケット 検索語を送ると、PENDING応答の後にEVENT QUERYで一致したオブジェクトIDの一覧が返ってきます。
- STEP 05
公式Rustクライアント(client/)のexamplesディレクトリにあるsearch_blocking.rsなどを実行すると、プロトコルの生コマンドを書かなくても検索・投入がAPI経由で試せます。
- STEP 06
core/tests配下のtypo_correction.rsやauto_completion.rsなどの統合テストを cargo test で流すと、タイポ訂正や補完機能が実際にどう動くかコード上で確認できます。
起動後は1491番ポート(デフォルト)でSonic Channelサーバが立ち上がり、PUSH/QUERY/SUGGESTなどのコマンドを送ることで、投入したテキストに対応するオブジェクトIDを検索結果として得られます。索引データはkvストアとfstストアの2つのディレクトリに保存され、メモリ使用量は数十MB程度に収まる設計です。ドキュメント本文自体は保存されないため、返ってきたIDを使って自前のデータベースから実データを引く運用になります。
Sonicはドキュメントそのものを保存しないID索引なので、検索結果を実データに変換する外部データベースを別途用意する必要があります。
READMEの記載通りDebian 12(bookworm)向けの64bitパッケージが中心で、他のディストリビューションやOSではソースビルドかDockerイメージに頼ることになります。
プロトコルはテキストベースの独自仕様(PROTOCOL.md参照)のため、公式クライアントがない言語では自前でコマンド送受信ロジックを実装する必要があります。
認証はSonic Channel接続時のパスワード一つのみで、TLSなどの暗号化機構は標準搭載されていないため、ネットワーク経路の保護は利用者側の責任になります。
IDベースの軽量な全文検索・オートコンプリート・タイポ訂正機能を、Elasticsearchほどの運用コストをかけずに追加したい小〜中規模サービスに向いています。core/tests配下に言語検出・ストップワード・タイポ訂正・データ分離などのテストが揃っており、80以上の言語のストップワードファイルが実在することからも、多言語対応の作り込みは読み取れます。実際にCrispという事業者が本番の大規模検索に使っている実績もREADMEに明記されているため、プロトコル仕様書(PROTOCOL.md)とクライアントコードを読める人であれば、インストールせずともここまでの説明で採用判断は十分にできると考えます。}}]}}} (補足: 上記の理由から、実運用前にはREADMEとPROTOCOL.mdを一読しコマンド仕様を把握することをおすすめします)