Googleカスタム検索/Google Site SearchからFessに移行する

# はじめに

サイト内検索の定番、Google Site Searchが[2018年に終了となる](https://enterprise.google.co.jp/intl/ja/search/products/gss.html)ことが決定されました。
2018年4月には、Google Site Searchから、広告付きのGoogle カスタム検索へ自動移行されてしまいます。
Google カスタム検索の広告はなかなか大きく、検索結果より上位に表示されてしまうので、できればなくしたいところです。

そこで、いくつか代替手段はありますが、5分で構築できる全文検索サーバ [Fess](http://fess.codelibs.org/)が提供しているサイト検索を使用してみます。
ここでは、Fess 11.2をローカルで立ち上げてサイト検索を試したいと思います。

検索結果例
![fess-ss-1.png](https://qiita-image-store.s3.amazonaws.com/0/43662/701205e9-fe16-8c09-8c1d-5ff02f8328ae.png)

# TL;DR

FessではGoogle Site Scriptと同様に、数行のスクリプトを埋め込めばサイト検索の設置/移行ができる。

# 準備

Fessをローカルにインストールします。本家のドキュメントはこちら。
[インストール — Fess 11.0 ドキュメント](http://fess.codelibs.org/ja/11.2/install/install.html)
今回はテストとしてサクッとDockerを使おうと思います。
[全文検索サーバー Fess を Docker で動かす](http://qiita.com/cookienote/items/1f2443be25630a78d946)

`$ docker run -d -p 8080:8080 --name fess codelibs/fess:latest`

Fessを起動したら、デフォルトでは [http://localhost:8080](http://localhost:8080) へアクセスすることでFessの検索ページを開くことができます。
まだサーバー内部にドキュメントがないので、検索しても0件となります。クロール設定を行って検索対象をクロールしましょう。
管理UIへアクセスして、クロールの設定を追加します。
管理UIへのアクセス方法は[こちら](http://fess.codelibs.org/ja/11.2/install/run.html#ui)。

クロールの設定に関しては、
[ウェブクロールの設定 — Fess 11.0 ドキュメント](http://fess.codelibs.org/ja/11.2/admin/webconfig-guide.html)
[Fess10の導入 Fess9との違いなど](http://qiita.com/makky05/items/34ee36e0193340be88bb#%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B)
を参照してください。

設定例

| 項目名      | 値          |
|-----------:|-------------|
| 名前         | Fess       |
| URL         | http://fess.codelibs.org/ |
| 深さ         | 3          |
| 最大アクセス数 | 100       |

クロールの設定を終えたら、システムのスケジューラからDefault Crawlerを選び、実行します。
しばらく待つとクロールが終了し、各ドキュメントはElasticsearchへインデックスされます。

# サイト検索を利用する

さて、それではサイト検索機能を使ってみましょう。
サイト検索のドキュメントは[こちら](http://fess.codelibs.org/ja/11.2/api/api-ss.html)。

ドキュメントによると、以下のスクリプトをHTML内に記述すれば検索ボックスを埋め込めます。
だいたいGoogle Site Searchと似たような感じですね。
`<Server Name>`はFessを起動しているサーバー名で置き換えます。
今回の場合、`localhost:8080`ですね。デフォルトポートは8080です。

```html
<script>
  (function() {
    var fess = document.createElement('script');
    fess.type = 'text/javascript';
    fess.async = true;
    fess.src = '//<Server Name>/js/ss/fess-ss.min.js';
    fess.charset = 'utf-8';
    fess.setAttribute('id', 'fess-ss');
    fess.setAttribute('fess-url', '//<Server Name>/json');
    var s = document.getElementsByTagName('script')[0];
    s.parentNode.insertBefore(fess, s);
  })();
</script>
<fess:search></fess:search>
```

今回はローカルに空のHTMLファイルを作成して、そこに記述してみました。
ローカルファイルのページを直接開くと、スキームが異なるからかうまく読み込めませんでした。
`http://localhost:8080`を指定してあげましょう。

```html
<!DOCTYPE html>
<html>
  <body>
    <script>
      (function() {
        var fess = document.createElement('script');
        fess.type = 'text/javascript';
        fess.async = true;
        fess.src = 'http://localhost:8080/js/ss/fess-ss.min.js';
        fess.charset = 'utf-8';
        fess.setAttribute('id', 'fess-ss');
        fess.setAttribute('fess-url', 'http://localhost:8080/json');
        var s = document.getElementsByTagName('script')[0];
        s.parentNode.insertBefore(fess, s);
      })();
    </script>
    <fess:search></fess:search>
  </body>
</html>
```

作成したファイルをブラウザで開くと、サイト検索ボックスが表示されています！
![Screenshot from 2017-06-29 16-02-27.png](https://qiita-image-store.s3.amazonaws.com/0/43662/4d4d7159-ae8e-c9d4-c529-d8f60acbc799.png)

実際に検索を行うと、以下のような画面に遷移します。
![Screenshot from 2017-06-29 16-11-00.png](https://qiita-image-store.s3.amazonaws.com/0/43662/ba0fe29d-5d37-949c-5902-c8873520a6d1.png)

導入は以上になります。
だいたい、Google Site Searchと同じような感じで使えるのではないでしょうか。

# おわりに

FessはJSON APIを備えているので、更に自分好みのインターフェースで全文検索を利用することもできます。
移行に悩んでいる方は、とりあえずOSSで試してみるといいかもしれません。
Github: [https://github.com/codelibs/fess](https://github.com/codelibs/fess)
日本語ドキュメント: [http://fess.codelibs.org/ja/](http://fess.codelibs.org/ja/)