静的サイトに検索機能を付ける
静的HTMLだけのサイトでも、検索は諦めなくてよい、という話です。
仕組み
- ビルド時に全記事から検索用のインデックス(JSON)を生成する
- 検索ページのクライアントJSがそれを読み込み、ブラウザ内で照合する
サーバーには検索エンジンも動的コードも要りません。
日本語の照合
英語のように単語がスペースで区切られていないため、素朴な部分一致だと精度が出ません。このサイトでは uni-gram / bi-gram(1文字・2文字の断片)でスコアリングしています。
「しずおか」で「静岡」は引けませんが、表記どおりの検索には十分実用になります。かな漢字の揺れまで拾いたくなったら、その時に考えます。
気を付けたこと
- 検索語はユーザー入力。 結果の描画は textContent か、エスケープ済み文字列に対してだけ
<mark>を挿入します。?q=に細工した文字列を入れたリンクを踏ませる反射型XSSの典型パターンがあるためです。 - インデックスのサイズ。 本文は整形記法を落としたプレーンテキストで持ち、数百記事でも数百KB程度に収まる想定です。それを超えたら分割を考えます。
使い心地
インデックスは初回検索時に一度読むだけなので、2回目以降の検索は即答です。小規模サイトの検索としては、外部サービスに頼るよりずっと手軽でした。