Ghost で検索機能(Search)を実装しよう! #荒業

phi phi on ghost

Ghost で検索機能(Search)をむりやり実装したので,その方法について書きます.
バージョンは 0.7 想定です.

ghostHunter を使う

Ghost 自体にはまだ正式な Search API は無いため, クライアントサイドで
どうにかやるしかないです.

そこで使えるのが ghostHunter というプラグインです!

https://github.com/jamalneufeld/ghostHunter

このプラグインは ghost の rss feed を ajax で取得し, lunr.js という Search Engine を使って
フィルタをして結果を表示するというなかなかな奇抜なことを行っています.

使い方はこんな感じです.

<form>  
  <input id="search-field" />
  <input type="submit" value="search">
  <input type="button" value="clear" onclick="clearResults();" />
</form>

<script src='http://code.jquery.com/jquery-2.1.4.js'></script>  
<script src='http://cdn.rawgit.com/jamalneufeld/ghostHunter/master/jquery.ghostHunter.js'></script>  
<script>  
var searchField = $("#search-field").ghostHunter({  
    results     : "#results",
    rss         : "/rss",
    //Enable the "search as you type" by uncommenting the following line
    //onKeyUp   : true
  });
function clearResults() {  
  searchField.clear();
}
</script>  

上のようなコードを post に貼り付けて公開すれば, そのブログの検索を実装できます.

search-field でフィルタされた結果を #results にリスト表示してくれます.

rss フィードで取得できる件数を可変にする

ghostHunter で検索機能を実装する方法を紹介しましたが, 実はまだ問題が残っています.
それは rss feed で取得できるエントリー数が 15 個固定だということです.

つまり最新 15 個からしか検索することができません. これじゃホントの検索機能とは言えないですよね?

そこでちょっと荒業ですが, Ghost 本体をイジります!!

Ghost 本体の ./core/server/data/xml/rss/index.js を修正します.

このファイルの一番下に generate() が定義されているのがわかるかと思います. その中で実行されている getDate() で rss に必要な post 情報を取得しています.

この getDate() に渡している options の limit の値を変更してあげれば その個数だけ post を拾ってくることができます.

下記のように query で指定できるようにしてあげましょう.

generate = function generate(req, res, next) {  
    // Initialize RSS
    ...

    // set limit
    if (req.query.limit) {
        options.limit = req.query.limit;
    }

    return getData(options).then(function then(data) {

これで /rss/?limit={n} とすれば n 個分のエントリーを取得できるようになります.

ghostHunter 側の処理も下記のように変更してあげましょう.

var searchField = $("#search-field").ghostHunter({  
    results     : "#results",
    rss         : "/rss/?limit=500",

これで, 荒業ではありますが検索機能の完成です.

ちなみにこのやり方で作った本ブログの検索ページは こちら です.

Reference