Hyper EstraierでWordPressで作られたサイトを全文検索してみる – Hyper Estraierのインストール~クロールまで

自分が作ったwordpressのサイトを、Hyper Estraierを使って全文検索できるようにした時のメモ。
結果から言うと、Hyper Estraierの設定自体はすごく簡単でした。

1. Hyper Estraierの利用ライブラリをインストール

http://fallabs.com/hyperestraier/intro-ja.htmlに記載されている以下をインストール

  • libiconv : 文字コード変換。バージョン1.9.1以降(glibcにも同梱)。
  • zlib : 可逆データ圧縮。バージョン1.2.1以降。
  • QDBM : 組み込み用データベース。バージョン1.8.75以降。

libiconvのインストール

$ sudo yum -y install libiconv-devel

zlibのインストール

$ sudo yum -y install zlib-devel

QDBMのインストール

$ sudo wget http://qdbm.sourceforge.net/qdbm-1.8.77.tar.gz
$ tar zxvf qdbm-1.8.77.tar.gz
$ cd qdbm-1.8.77
$ ./configure --enable-zlib
$ make
$ make install

2. Hyper Estraierのインストール

http://fallabs.com/hyperestraier/公式からソースをダウンロード

$ tar zxvf hyperestraier-1.4.13.tar.gz
$ cd hyperestraier-1.4.13
$ ./configure --enable-mecab
$ make
$ make install

3. クローラーの準備

$ mkdir index
$ estwaver init index

4. クローラーの設定

$ vim index/_conf
#クロールするサイトのURLを指定
# seed documents (weight and URL)
seed: 1.0|http://path.to.domain/

#対象サイト内のみでのクロール
# allowing regular expressions of URLs to be visited
allowrx: ^http://path.to.domain/

# 日本語サイトのクロールなので1にする
# preferred language (0:English, 1:Japanese, 2:Chinese, 3:Korean, 4:misc)
language: 1

5. クローラーを動かしてみる

$ estwaver crawl -revcont index/
2012-10-15T12:37:51Z     INFO     DB-EVENT: status: name=index//_index dnum=10246 wnum=13630 fsiz=44759342 crnum=0 csiz=0 dknum=0
2012-10-15T12:37:51Z     INFO     crawling started (revcont)
2012-10-15T12:37:51Z     INFO     fetching: 0: http://path.to.domain/
2012-10-15T12:37:52Z     INFO     ignored: 301: http://path.to.domain/
2012-10-15T12:37:52Z     INFO     waiting for threads: 0
2012-10-15T12:37:52Z     INFO     waiting for threads: 0
2012-10-15T12:37:52Z     INFO     crawling finished
2012-10-15T12:37:52Z     INFO     DB-EVENT: closing: name=index//_index dnum=10246 wnum=13630 fsiz=44759342 crnum=0 csiz=0 dknum=0
2012-10-15T12:37:52Z     INFO     finished successfully

なんか301リダイレクトされている。。

6. 原因を探ってみる

wgetだとちゃんとhtmlを取得しているようなので、クローラーは問題ないはず。
ということで、wordpressの内部を見てみた。
index.phpから順にたどっていくと、/wp-includes/template-loader.phpの以下あたりでリダイレクトされているらしい

if ( defined('WP_USE_THEMES') && WP_USE_THEMES )
        do_action('template_redirect');

で、さらに探ってみると

/wp-includes/canonical.php
の46行目の$_SERVER['HTTP_HOST']のあたりが怪しい。。
クロールしてるときにどんな値をとっているのかわからないが、すでにサーバのドメインはわかっているので、ハードコーディングしてみる。

if ( !$requested_url ) {
    // build the URL in the address bar
    $requested_url  = is_ssl() ? 'https://' : 'http://';
    $requested_url .= 'path.to.domain';
    $requested_url .= $_SERVER['REQUEST_URI'];
 }

7. もう一度試してみる

$ estwaver crawl -revcont index/
2012-10-15T13:16:21Z     INFO     DB-EVENT: status: name=index//_index dnum=10246 wnum=13630 fsiz=44759342 crnum=0 csiz=0 dknum=0
2012-10-15T13:16:21Z     INFO     crawling started (revcont)
2012-10-15T13:16:21Z     INFO     fetching: 0: http://path.to.domain/ 
2012-10-15T13:16:21Z     INFO     seeding: 1.000: http://path.to.domain/
.
.
2012-10-15T13:16:21Z     INFO     crawling finished
2012-10-15T13:16:21Z     INFO     DB-EVENT: closing: name=index//_index dnum=10246 wnum=13630 fsiz=44759342 crnum=0 csiz=0 dknum=0
2012-10-15T13:16:21Z     INFO     finished successfully

正常にクロールできた。

8. 確認してみる

$ estcmd search -vs index/_index "サンプル"
--------[02D18ACF07171840]--------
VERSION 1.0
NODE    local
HIT     53+
HINT#1  サンプル        53+
TIME    0.000197
DOCNUM  54
WORDNUM 2789
VIEW    SNIPPET
.
.
.

ちゃんと検索できてるっぽい。

とりあえずクロールまではこれで完了。
次はGUIの方を作ってみる。