WP Serverless Search – 静的 WordPress のサイト検索プラグインの再考

数カ月前の WordCamp Philly で、静的 WordPress サイトに検索機能を持たせるプラグインをローンチしました。このプラグインは WP Serverless Search と名付け、GitHub からダウンロードできます。

ベータ版にも関わらず、複数の商用サイトで採用されています。僕らの推奨する検索機能を提供するプラグインとして、これを再考し、制限などを検証したいと思います。

プラグイン作成の背景
このプラグインの大半はだいたい1日程度で書かれていて、アイデアはシンプルなものです。すべてのコンテンツを XML ファイルへ保存する機能や、それをローカルに保存する機能など、 WordPress のコアに備わる機能を使っています。この保存されたファイルを検索対象としてします。

検索対象となるファイルはプラグインのインストール時や記事の執筆時、編集時に作成されます。オープンソースのあいまい検索ライブラリの FuseJS と、検索結果を表示させる Micro Modal を組み合わせていて、実際に動くデモは驚くほどにシンプルでした。

現時点で、このアイデアは検討に値すると思いますし、パフォーマンスに大きなメリットが有ると気づきました。1000記事程度のデモサイトのサイト内検索では、検索結果は即座に反映されます。 WordPress サイトのあいまい検索はたったミリ秒ほどしかかかりません。検索語の入力中でも即座に検索結果に反映されてきます。

このプラグインの課題は、10,000 以上の記事を持つ超巨大 WordPress サイトへインストールするまではよく分かりませんでした。ただ、このプラグインには、記事のパースと読み込みに関して、明らかに上限があると分かりました。プラグインのインストール後、検索対象となるファイルが作成された際、サイズはとても大きく、75MB 程に膨れ上がりました。

僕は今、どのようにしてこの問題を解決しようかと思案しているところです。解決策がなんであれ、大規模なサイトだけでなく、小規模のサイトでも高速化できると確信しています。

いくつかのアイデアをご紹介しましょう。
小さいファイルを生成するという方法。このプラグインに組み込む最も簡易なオプションは、 WordPress のコアに直接組み込まれている XML のエクスポート機能を使用することです。
簡単な解決方法に見えますが、ファイルサイズがやっかいな問題になります。
1つのファイルから検索に無関係なコンテンツを取り除ければいいのですが、記事のサイズ自体が大きければサイズの大きいファイルを生成するため、一時的な解決にしかならないかもしれません。

エクスポートしたデータをパースして細かいファイルに分割していくという方法。
このアイデアは前者より気に入っています。ただ、 検索対象のファイルを読み込めるよう JavaScript の関数を変更する必要があります。記事を保存する際、すべてのコンテンツを改めて検索するのではなく、その記事専用の XML ファイルを作成できます。このコンセプトにはメリットがあるし、更に調査することになるコンセプトでしょう。

REST や GraphQL を実装してデータを分析する方法。
これなら、ファイルを小さいファイルに分割するにせよ、大きいままにしておくにせよ、インタープリタのようなものをトップに追加するという方法もいい方法だろうと思います。必要なデータに対してのみクェリを投げられれば、プロセス全体の改善ができるでしょう。
さて、これからブラウザからどんな感じでこの処理を実行させるかを検討する必要があります。

WP Sserverless Form の次期バージョンに関して、準備や検討する項目があればぜひお気軽にお知らせください。