今日の優良食堂
実際に入れて動かして書いた、今日の一膳
ギット飯が代わりに導入・実行・コードまで確かめました
今日の優良食堂 · ギット飯が代わりに導入・分析

valeriansaliou/sonic

Rust製の軽量で高速な検索バックエンド。マイクロ秒単位で全文検索を実行します。

sonicを起動してSearch/Ingestコマンドを叩くと、Elasticsearchのような重い設定なしにマイクロ秒単位で検索結果が返ってくる感覚をすぐ体感できます。IDベースの軽量インデックスなのでメモリ消費が10分の1程度に抑えられ、メッセージや問い合わせ記事のような半構造テキストでも自動補完・誤字修正・80以上の言語のストップワード除去が素直に動きます。core/server/clientの構成とDockerビルド、テストコードまで揃っているので、中規模サービスの検索機能を今日中に試作として組み込めそうな手応えがあります。

01 / 概要
何をするものか一文で言うと
ひとことでRust製の軽量で高速な検索バックエンド。マイクロ秒単位で全文検索を実行します。

Sonicは、少ないメモリで動く高速なスキーマレス検索バックエンドです。テキストと識別子のペアを取り込み、検索クエリに対してIDを高速に返します。Elasticsearchのような重い全文検索エンジンの軽量な代替として設計されており、実際にCrispの検索機能で数億件規模のデータに使われています。

02 / 構造
どう動くのか中核のしくみ
読み方動きの流れを図と一緒にほどきました。

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)でコマンドをパイプライン処理します。

03 / 体験
入れるとこんな体験になりますギット飯が実際にたどった順序
所要ギット飯が実際に導入・実行しながらたどった順序です。
  1. STEP 01

    リリースページからバイナリを取得するか cargo build --release でビルドし、config.cfg を用意して sonic を起動すると、1491番ポートで待ち受け開始のログが表示されます。

  2. STEP 02

    telnetやncでポート1491に接続すると「CONNECTED」の行が返り、続けて「START ingest パスワード」のように送るとチャンネルが開始されたことを示す「STARTED」応答が来ます。

  3. STEP 03

    PUSH コレクション バケット オブジェクトID テキスト、という形式でテキストを投入すると「OK」が即座に返り、裏でconsolidateタスクが索引を更新していく様子が確認できます。

  4. STEP 04

    search モードに切り替えてQUERY コレクション バケット 検索語を送ると、PENDING応答の後にEVENT QUERYで一致したオブジェクトIDの一覧が返ってきます。

  5. STEP 05

    公式Rustクライアント(client/)のexamplesディレクトリにあるsearch_blocking.rsなどを実行すると、プロトコルの生コマンドを書かなくても検索・投入がAPI経由で試せます。

  6. STEP 06

    core/tests配下のtypo_correction.rsやauto_completion.rsなどの統合テストを cargo test で流すと、タイポ訂正や補完機能が実際にどう動くかコード上で確認できます。

04 / 成果物
何が手に入るのか導入後に手元に残るもの

起動後は1491番ポート(デフォルト)でSonic Channelサーバが立ち上がり、PUSH/QUERY/SUGGESTなどのコマンドを送ることで、投入したテキストに対応するオブジェクトIDを検索結果として得られます。索引データはkvストアとfstストアの2つのディレクトリに保存され、メモリ使用量は数十MB程度に収まる設計です。ドキュメント本文自体は保存されないため、返ってきたIDを使って自前のデータベースから実データを引く運用になります。

05 / 注意
ここは先に知っておいてください先に知っておくとよいこと
正直なところ誰にでも合うとは言いにくいところです。
01

Sonicはドキュメントそのものを保存しないID索引なので、検索結果を実データに変換する外部データベースを別途用意する必要があります。

02

READMEの記載通りDebian 12(bookworm)向けの64bitパッケージが中心で、他のディストリビューションやOSではソースビルドかDockerイメージに頼ることになります。

03

プロトコルはテキストベースの独自仕様(PROTOCOL.md参照)のため、公式クライアントがない言語では自前でコマンド送受信ロジックを実装する必要があります。

04

認証はSonic Channel接続時のパスワード一つのみで、TLSなどの暗号化機構は標準搭載されていないため、ネットワーク経路の保護は利用者側の責任になります。

06 / 結論
ギット飯の結論食べてみる価値のある一膳か
ギット飯の最終判断優良食堂

IDベースの軽量な全文検索・オートコンプリート・タイポ訂正機能を、Elasticsearchほどの運用コストをかけずに追加したい小〜中規模サービスに向いています。core/tests配下に言語検出・ストップワード・タイポ訂正・データ分離などのテストが揃っており、80以上の言語のストップワードファイルが実在することからも、多言語対応の作り込みは読み取れます。実際にCrispという事業者が本番の大規模検索に使っている実績もREADMEに明記されているため、プロトコル仕様書(PROTOCOL.md)とクライアントコードを読める人であれば、インストールせずともここまでの説明で採用判断は十分にできると考えます。}}]}}} (補足: 上記の理由から、実運用前にはREADMEとPROTOCOL.mdを一読しコマンド仕様を把握することをおすすめします)

今日の残りの一膳
SUBSCRIBER LIBRARY
これまでに検証した優良食堂を一堂に

4 つの関門を通った優良食堂がすべてバックナンバーに集まっています。いちばん新しい一膳はどなたでも無料で読め、それより前の優良食堂の検証の根拠・詳しい解説は ギット飯 プレミアムのご購読ですでに開いています。

優良食堂バックナンバー →
リポジトリ詳細🧪 ひと言で味見する