静的サイトに特化した全文検索ライブラリ「Pagefind」、さくらのレンタルサーバで動かしてみた
今回は「静的サイトに特化した全文検索ライブラリ「Pagefind」、さくらのレンタルサーバで動かしてみた」についてご紹介します。
関連ワード (動作確認、同時、開発等) についても参考にしながら、ぜひ本記事について議論していってくださいね。
本記事は、Publickey様で掲載されている内容を参考にしておりますので、より詳しく内容を知りたい方は、ページ下の元記事リンクより参照ください。
先日、静的サイトに特化した全文検索ライブラリとして「Pagefind」というソフトウェアがあることを、下記の記事が話題になったことで知りました。
参考:静的サイトに特化した検索ライブラリ Pagefind を試す | grip on minds
実は、いまお読みのPublickeyはまさに、Movable TypeというCMSを用いて生成された静的なWebサイトです。現在、PublickeyではGoogleが提供している「Googleカスタム検索エンジン」を全文検索エンジンとして採用しています(右上の虫眼鏡アイコンから呼び出せます)。
しかしPublickeyでは以前からGoogleに依存しない、自前の全文検索エンジンを持てないかと模索しており、まさにPagefindは私が探し求めていたソフトウェアだったと言えます。
そこでさっそくPagefindがPublickeyに導入できるかどうか、調べてみることにしました。
Pagefindをさくらのレンタルサーバで動かせるか?
上記の記事や公式サイトを読むと、Pagefindの仕組みは、「pagefind」というコマンドをサーバ上で実行することで静的サイトの大量のHTMLファイルを読み込み、インデックスファイルをJavaScriptファイルなどのファイル群として生成します。
それをWebブラウザ上で読み込み、ユーザーが入力した検索キーワードに対応してJavaScriptが実行され、結果を表示する、というもののようです。
仕組みそのものはPublickeyでも利用できそうだということが分かりました。
ただし問題が2つありました。
1つは、ドキュメントによるとPagefindのインストールにはNode.jsのパッケージマネージャに関連した「npx」コマンドを使うと説明されていることです。Publickeyは、さくらのレンタルサーバを利用しているのですが、さくらのレンタルサーバにはNode.js環境は標準で用意されていません。
もう1つは、Pagefindが公式で提供しているビルド済みのファイルは、Windows版、macOS版、Linux版しか提供されていないことです。さくらのレンタルサーバのOSはFreeBSDなので、そのままでは実行できません。
この2つを同時に解決するには、PagefindのソースコードをFreeBSD上でビルドし、できあがったバイナリをさくらのレンタルサーバに転送し実行する、という方法が考えられます。
早速試してみることにしました。
Windows上の仮想マシンでFreeBSDを動かす
具体的には、Windows上で仮想マシンを起動し、そこでFreeBSD環境を用意します。
次に、PagefindはRust言語で開発されていることが分かったので、FreeBSD上にRust言語をインストールし、Pagefindをビルドする、という手順で試してみましょう。
Windows 11での仮想マシンの立ち上げは、コントロールパネルを起動し、Hyper-Vを有効にします。
次に、FreeBSDの公式サイトからHyper-V用のイメージを取得します。さくらのレンタルサーバはFreeBSD 13.0だったので、FreeBSD 13.2のAMD64版となる「FreeBSD-13.2-RELEASE-amd64.vhd.xz」をダウンロードし、解凍します。
解凍したファイルをHyper-Vで読み込んで起動すると、仮想マシン上でFreeBSD 13.2が起動します。
ただしデフォルトの状態ではストレージの容量が5GBしかなく、Rust言語がインストールできません。そこで、こちらのサイトを参考に、ストレージを拡張します。
基本的な操作は、Hyper-Vマネージャから仮想ハードディスクの拡張を行い、その後FreeBSDのコンソールからrootで以下のコマンドを実行することになります。
Rust環境でPagefindのビルドを実行
これでFreeBSDのストレージ容量が確保できたので、次はRust言語のインストールとPagefindのビルドです。このサイトが大変参考になりました。
Rust環境の構築は次のコマンドをrootのまま実行しました。
これでRut言語だけでなくパッケージマネージャのcargoまでインストールしてくれます。
次に、cargoコマンドでPagefindをインストールするため、以下のコマンドを入力します。するとPagefindのソースコードを取得してビルドしてくれます。
ビルドが正常に終了すれば、「pagefind」コマンドが「/root/.cargo/bin/」の下に保存されています。これでFreeBSDで実行可能なPagefindのバイナリが手に入ったはずです。
これをftpのバイナリモードなどで、さくらのレンタルサーバへ転送します。そしてパスを通して実行してみたところ、エラーを吐くことなく無事に実行できました!
あとは設定やカスタマイズ
あとは公式ドキュメントを読みつつ、設定やカスタマイズを行えばよいはずです。
また、cronを使って定期的にpagefindコマンドを実行するように設定すれば、つねに最新のコンテンツに対して検索できるようになります。
ちなみに、Publickeyの約6000記事のインデックス化にかかった時間は約20秒でした。その高速さにも驚かされました。
下記が、実際にさくらのレンタルサーバでPagefindを動かしてPublickeyのコンテンツをインデックス化し、検索可能にしたものです。「AWS」とか「Kubernetes」とか「GitHub」とか、適当なキーワードを入力してみてください。
document.addEventListener(‘DOMContentLoaded’, () => {
new PagefindUI({ element: “#search”,pageSize : 10,
excerptLength: 50 });
});
まだデフォルトの状態のままなので、結果が長くなって見にくいところなどがありますが、実際にPagefindがさくらのレンタルサーバ上で(そしてMovable Typeのコンテンツでも問題なく)動くこと、そして6000本以上もある記事でもサクサクと検索できることを確認できると思います。
もう少し動作確認と設定を行った後、近いうちにPublickeyでこのPagefindを正式な機能として投入しようと考えています。お楽しみに!
関連記事
Publickeyは昨年(2023年)、関連記事の動的生成を自前のプログラムで実現することに成功しています。Pagefindは、もしかしたら関連記事の精度を高めることに活用できるかもしれない、とも思っています。
- Publickeyが関連記事の動的生成をPHPとJavaScriptとMovableTypeで実装した方法とは?