Skip to content
This repository has been archived by the owner on Jun 29, 2020. It is now read-only.

django haystack ElasticSearch Kuromojiで日本語全文検索

giginet edited this page Jul 27, 2014 · 2 revisions

全文検索の環境構築

Java製サーチエンジンの「ElasticSearch」を使ってKawazポータルを日本語全文検索できるようにします。

例の如くMac向けに書いているので、その他の環境ではがんばってください

Java SEのインストール

普通にjavaとかしてしまうと、Java6が入ってしまう。

ElasticSearchはJava7以上で走らせないと落ちるっぽいので、Java7以降を入れること!

Homebrew Caskで入れるのが楽ちんです。

$ brew cask install java
$ java -version
Java(TM) SE Runtime Environment (build 1.8.0xxx)

こうすると、Java8が入る(2014/7/27現在)

ElasticSearchのインストール

$ brew install elasticsearch

ここでは1.3.0を入れている。バージョンが変わると、Kuromojiのバージョンも変わるかも。(後述)

Kuromojiのインストール

Kuromojiとは、日本語向けの形態素解析ライブラリ

ElasticSearch で kuromoji を使う (ES 0.90.Beta1 + kuromoji 1.2.0篇) - Qiita

$ cd /usr/local/Cellar/elasticsearch/1.3.0 # バージョン1.2.1の場合。バージョンによってPATHが変わるので注意!
$ bin/plugin -install elasticsearch/elasticsearch-analysis-kuromoji/2.3.0 # 必ず2.3.0(後述)

これだけでKuromojiが自動的に使われるようになる。

なぜかKuromojiの2.2.0じゃないとTokenizerで死ぬ。2.1.0でも、なぜか2.3.0でもダメ。

どうやらKuromojiとElasticsearchのバージョンがちゃんとあっていないとエラー吐くらしい。

以下の環境では動くことを確認。

Elasticsearch Kuromoji
1.2.1 2.2.0
1.3.0 2.3.0

両者のバージョンが一致していないと、rebuild_indexの際に何かJavaのエラー吐いて死ぬので注意すべし。

参考:

MongoDB+Elasticsearchで全文検索をする(失敗) - エロサイトの作り方

MongoDB+Elasticsearchで全文検索をする(リトライ) - エロサイトの作り方

古い資料だと、この後elasticsearch.ymlの変更が必要だと書いているが、最近のやつだと初期設定でもインストールされていればKuromojiを使ってくれる。

Django側にライブラリを入れる

$ cd ~/Kawaz3rd
$ pip install --upgrade -r requirements.txt

これで、django-haystackと、pyelasticsearchが入ればOK

インデックスの更新

今のDBのデータをインデックス化してあげる必要がある

$ elasticsearch # index作成前に起動する必要がある
$ python manage.py rebuild_index --noinput # --noinput付けないとハマるので注意!(後述)
$ python manage.py update_index

これで上手くインデックスがアップデートされたはず。終わったらelasticsearchを停止させても良い。

haystackのバグで、Python3で動かすときは--noinputを付けないと動かない。

結構前に直ってるのにまだ正式版にmergeされてなくて地獄っぽい。

manage.pyと、elasticsearch両方のログを見ること。manage.pyで上手く行っててもelasticsearchがJavaのエラー吐いてることがある。

Haystack 2.1 with python 3.3.2 and Django 1.6 · Issue #902 · toastdriven/django-haystack

honchoでサーバー起動

$ honcho start -f Procfile.dev

これで自動的にelasticsearchも立ち上げてくれる。便利

検索を試す

以下のページにアクセスして検索してみましょう。

http://localhost:8000/search/

ちゃんと検索できてるっぽかったら成功!お疲れ様でした。

今後の展望

このままでも使えるけど、高速化には Celery + Redisを設定すると良いらしい。あとでやる。

django-celery 3.1.10 : Python Package Index

参考資料

Django + Haystack + Elasticsearch コトハジメ

Haystack + Elasticsearch + kuromoji コトハジメ

voluntas/downpour