CLOVER🍀

That was when it all began.

Ubuntu LinuxにElasticsearch 2.1とKuromojiをインストールする

そろそろ、Elasticsearchを少しずつ触っていってみようかと思いまして。

とはいえ、自分はあんまり検索エンジンはやったことがないので、まあ気ままにマイペースで試していけたらなぁと思っています。

一応、LuceneおよびHibernate Searchは趣味的に遊んだことがあります。Apache Solrは、この前初めて使いました。あと、この本は持っています。

高速スケーラブル検索エンジン ElasticSearch Server

高速スケーラブル検索エンジン ElasticSearch Server

が、1.5くらいの時にzipを展開して起動したことがあるくらいの状態です。

とまあ、そんな人がやってみますということで。

環境は、Ubuntu Linuxとします。

インストール

zip、tar.gzを落としてきてもよかったのですが、ここはパッケージインストールすることにします。

Download Elasticsearch Free • Get Started Now | Elastic

https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-repositories.html

リポジトリの追加。

$ wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
OK
$ echo "deb http://packages.elastic.co/elasticsearch/2.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-2.x.list
deb http://packages.elastic.co/elasticsearch/2.x/debian stable main

apt-get updateして

$ sudo apt-get update

インストール。

$ sudo apt-get install elasticsearch

バージョン指定したい場合は、「elasticsearch」の後ろにバージョンを書きます。

$ sudo apt-get install elasticsearch=2.1.1

現時点での最新版は、2.1.1です。

ディレクトリ構成

ディレクトリ構成は、こちらを参照。

https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-dir-layout.html#default-paths

「/usr/share/elasticsearch」にスクリプトプラグインなど。

$ find /usr/share/elasticsearch -type d
/usr/share/elasticsearch
/usr/share/elasticsearch/bin
/usr/share/elasticsearch/lib
/usr/share/elasticsearch/plugins

インデックスの保存先は「/var/lib/elasticsearch/data」、ログは「/var/log/elasticsearch」となります。

設定ファイルは、「/etc/elasticsearch」。

$ sudo find /etc/elasticsearch
/etc/elasticsearch
/etc/elasticsearch/logging.yml
/etc/elasticsearch/elasticsearch.yml
/etc/elasticsearch/scripts

環境変数の定義は、「/etc/default/elasticsearch」にあります。

起動と停止

起動。

$ sudo service elasticsearch start

停止。

$ sudo service elasticsearch stop

Kuromojiのインストール

検索に使うなら、きっと入れておいた方がいいだろうとKuromojiをインストール。

Kuromojiのプラグインって、本家に入ったんですねぇ…

https://github.com/elastic/elasticsearch/tree/master/plugins/analysis-kuromoji

インストール。

$ sudo -u elasticsearch /usr/share/elasticsearch/bin/plugin install analysis-kuromoji

とりあえず、再起動。

$ sudo service elasticsearch restart

それでは、Kuromojiの設定をしてみます。

一応、ユーザー定義辞書はある前提でいきます。中身は空ですが(Kuromojiの定義方法で書けばいいのだろうとたかをくくって…)、事前に作っておく必要があります。

$ sudo touch /etc/elasticsearch/userdict_ja.txt && sudo chown root.elasticsearch /etc/elasticsearch/userdict_ja.txt

で、こんな設定で(Solrの設定を参考にしています)。
settings.json

{
  "settings": {
    "index": {
      "analysis": {
        "tokenizer": {
          "kuromoji_tokenizer_search": {
            "type": "kuromoji_tokenizer",
            "mode": "search",
            "discard_punctuation" : "true",
            "user_dictionary" : "userdict_ja.txt"
          }
        },
        "analyzer": {
          "kuromoji_analyzer": {
            "type": "custom",
            "tokenizer": "kuromoji_tokenizer_search",
            "filter": ["kuromoji_baseform",
                       "kuromoji_part_of_speech",
                       "cjk_width",
                       "stop",
                       "ja_stop",
                       "kuromoji_stemmer",
                       "lowercase"]
          }
        }
      }
    }
  }
}

登録。

$ curl -XPUT http://localhost:9200/myindex -d @settings.json
{"acknowledged":true}

確認。

$ curl -XPOST 'http://localhost:9200/myindex/_analyze?analyzer=kuromoji&pretty' -d 'Elasticsearchは、全文検索エンジンです。'
{
  "tokens" : [ {
    "token" : "elasticsearch",
    "start_offset" : 0,
    "end_offset" : 13,
    "type" : "word",
    "position" : 0
  }, {
    "token" : "全文",
    "start_offset" : 15,
    "end_offset" : 17,
    "type" : "word",
    "position" : 2
  }, {
    "token" : "検索",
    "start_offset" : 17,
    "end_offset" : 19,
    "type" : "word",
    "position" : 3
  }, {
    "token" : "エンジン",
    "start_offset" : 19,
    "end_offset" : 23,
    "type" : "word",
    "position" : 4
  } ]
}

それっぽい。

プラグイン

プラグインは、elasticsearch-headとelasticsearch-HQあたりをとりあえず入れておけばいいのでしょうか?

いつも入れているElasticsearchのプラグイン - @johtaniの日記 2nd

Marvelとかは、今度調べましょう…。

Dockerイメージ

と、ここまでやったところで、オマケ的にDockerfileを書いてみます。
Dockerfile

FROM ubuntu:latest

ENV JAVA_HOME /usr/lib/jvm/java-8-oracle

ENV ELASTICSEARCH_VERSION 2.1.1
ENV ELASTICSEARCH_REPOSITORY http://packages.elasticsearch.org/elasticsearch/2.x/debian

EXPOSE 9200 9300

## Oracle JDK 8インストール
RUN echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | debconf-set-selections && \
    apt-get install -y software-properties-common && \
    add-apt-repository -y ppa:webupd8team/java && \
    apt-get update && \
    apt-get install -y oracle-java8-installer

## ツールインストール
RUN apt-get install -y wget \
                       curl \
                       vim

## Elasticsearchインストール
RUN wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | apt-key add - && \
    echo "deb ${ELASTICSEARCH_REPOSITORY} stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-2.x.list && \
    apt-get update && \
    apt-get install -y elasticsearch=${ELASTICSEARCH_VERSION}

RUN cp -p /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.default
ADD elasticsearch.yml /etc/elasticsearch/elasticsearch.yml
RUN chown root.elasticsearch /etc/elasticsearch/elasticsearch.yml

## Elasticsearchプラグインインストール
RUN sudo -u elasticsearch /usr/share/elasticsearch/bin/plugin install analysis-kuromoji && \
    sudo -u elasticsearch /usr/share/elasticsearch/bin/plugin install mobz/elasticsearch-head && \
    sudo -u elasticsearch /usr/share/elasticsearch/bin/plugin install royrusso/elasticsearch-HQ

## プラグイン等向け設定ファイル
RUN touch /etc/elasticsearch/userdict_ja.txt && \
    chown root.elasticsearch /etc/elasticsearch/userdict_ja.txt

ENTRYPOINT service elasticsearch start && \
            sudo -u elasticsearch touch /var/log/elasticsearch/elasticsearch.log && \
            tailf /var/log/elasticsearch/elasticsearch.log

ホスト側からも接続できるように、「elasticsearch.yml」は以下の内容で準備。
elasticsearch.yml

network.host: 0.0.0.0

ビルド。

$ docker build -t kazuhira/elasticsearch:2.1.1 .

起動。

$ docker run -it --rm -p 9200:9200 -p 9300:9300 --name elasticsearch kazuhira/elasticsearch:2.1.1

参考にしたのは、こちらです。

https://github.com/docker-library/elasticsearch/tree/master/2.1