Ghostのカスタムテーマ作成(その4)

サイト内検索をどうにかできないか検証する。

Wordpressのデフォルトテーマには、サイト内検索が実装されているが、GhostのCasperテーマなどには存在しない。公開されているカスタマイズテーマには、ちらほら検索機能が実装されているみたいで、どうしているのか調査したところ、大抵のテーマはghostHunterというクライアントベースのスクリプトを使うようである。

ghostHunterは使えるのか?

内部で検索エンジンとしてlunr.jsを使用している。以下のサイトでもこのスクリプトの使い方が投稿されている。

how to using ghosthunter https://www.ghostforbeginners.com/adding-search-to-ghost-using-ghosthunter/

ところがこのghostHunterは、日本語に対応してないという致命的な制限がある。
(英語のようにスペースで単語が区切られてないと動作しないようである)

lunr.jsの多言語対応版としてlunr-languagesを組み合わせることによって日本語も対応可能になる。

lunr-languages https://www.github.com/MihaiValentin/lunr-languages

ところが、ghostHunterのスクリプトを覗いていると、lunrのコードがまるまるインクルードされており、スクリプトを改造しないといけない。

しかも、内部では、/rssコンテキストにアクセスして、取得した情報から全文検索しているが、Ghostは/rssにアクセスしても、最新の15件しか返さないので、16件以前の投稿は検索にはヒットしないという残念な結果になるので、サイト内検索と呼べる代物ではない。。

この問題は、core/server/models/plugins/pagination.js内のdefaults.limit = 15allに変更してしまえば、すべての投稿が対象になるが、ghostのアップデートのたびに修正が必要になる。

しかもまだ問題があって、実際に上記の変更を加えて100件ほどの投稿から検索ページを表示すると、
ページがロードされたときにlunr.js内で、インデックス作成処理で、数秒固まってしまう

結論としては、そうまでしてghostHunterを使うメリットがないと思われる。

プラグイン的な実装をするならば、自前でGhostのAPIを使って、クライアントベースの全文検索を作成したほうが早そうである。