Elasticsearchのインストールからデータ投入まで

最近、仕事関係でElasticsearchを使い始めました。
メモとして、データ投入からスコアリングまで使った・学んだことを書いてみようと思います。

全部書くのは結構長くなりますので、前後編に分けて書きます。
前編はインストールからデータの投入まで、
後編は検索とスコアリングの話しようと思っております。

##インストール
とりあえず、必要なものをインストールします。
開発環境はCentOS7です。

>Elasticsearch requires at least Java 8. Specifically as of this writing, it is recommended that you use the Oracle JDK version 1.8.0_73.

バージョン8以上のJavaが必要です。

###Javaのインストール

まずはJava 8をインストールします。
[こちら](http://zero-config.com/centos/install-java8.html)を参考しながら進めます。
もし、すでにJava1.7の古いバージョンが入っていれば、上記のリンクにはJavaVMの切り替え方法も書いてあります。

Java7を削除してJava8を再インストールしてもいいです。

```
$ sudo yum remove -y java-1.7.0-openjdk
$ sudo yum install -y java-1.8.0-openjdk-devel
$ sudo yum install -y java-1.8.0-openjdk-debuginfo --enablerepo=*debug*
```
バージョン確認

```
$ java -version
java version "1.8.0_111"
Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)
```

###Elasticsearchのインストール

yumでインストールできるのは2.xの古いバージョンです。
ここではElasticsearch5.0を使うので、Elasticsearch5.0をインストールします。
（最近、6もリリースされたみたいです。）
インストールは[Elasticsearch Docs](https://www.elastic.co/guide/en/elasticsearch/reference/current/_installation.html)の手順に従って進めばよいですが、起動はうまくいけませんでした。( ；∀；)

[別方法](https://www.elastic.co/guide/en/elasticsearch/reference/5.0/rpm.html)として、rpmからインストールします。（現在、6はrpmインストールできません。）

```
# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
# vim /etc/yum.repos.d/elasticsearch.repo
[elasticsearch-5.x]
name=Elasticsearch repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

# yum install elasticsearch
# systemctl enable elasticsearch
# systemctl start elasticsearch
```

起動できたかテスト

```
# curl localhost:9200
{
  "name" : "3Y-W_H1",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "cYenb8Q8S22EHcxJPL7k2Q",
  "version" : {
    "number" : "5.0.0",
    "build_hash" : "253032b",
    "build_date" : "2016-10-26T04:37:51.531Z",
    "build_snapshot" : false,
    "lucene_version" : "6.2.0"
  },
  "tagline" : "You Know, for Search"
}

```

起動できましたね。

###kibanaのインストール

[Elastic Doc](https://www.elastic.co/guide/en/kibana/5.0/rpm.html)を参考に。

```
# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
# vim /etc/yum.repos.d/kibana.repo
[kibana-5.x]
name=Kibana repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

# yum install kibana
# systemctl enable kibana
# systemctl start kibana
```

接続を設定します。

```
# vim /etc/kibana/kibana.yml
network.host: "0.0.0.0"
elasticsearch.url: "http://localhost:9200"
# systemctl restart kibana
```

ブラウザで開きましょう。

`http://192.168.216.128:5601`

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/144971/44d56693-10af-15e2-4f2d-ade7b0e45d78.png)

無事につなぎました。((´∀｀))

###Kuromojiのインストール
日本語分析用のpluginもインストールしましょう。

```
# /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-kuromoji
# systemctl restart elasticsearch
# curl -X GET 'http://localhost:9200/_nodes/plugins?pretty'
…
"plugins" : [
        {
          "name" : "analysis-kuromoji",
          "version" : "5.0.0",
          "description" : "The Japanese (kuromoji) Analysis plugin integrates Lucene kuromoji analysis module into elasticsearch.",
          "classname" : "org.elasticsearch.plugin.analysis.kuromoji.AnalysisKuromojiPlugin"
        }
      ],
…
```

###おまけ

クラウド版の[Elastic Cloud](https://cloud.elastic.co/)もあります。（14日の無料試用期間があります。）
Elasticさんは独自のサーバーではなくて、AWSのサーバーを利用しています。
完全にブラウザでGUI操作は便利ですけど、サーバーの裏側（CUI）に入れないとも不便です。

##Pythonを使ってデータの投入

一つ目はkuromojiを使ってみたいので、Twitter情報を取り込んで、日本語分析してみます。
二つ目はkibanaの地図を使ってみたいので、地震情報を投入してみます。

###1.Twitter情報の分析
Twitter収集などにはあまり詳しくないので、[こちら](http://qiita.com/yoppe/items/3e61fd567ae1d4c40a96)の内容を参考にして進めていきます。

```
# python -V
Python 3.5.2 :: Anaconda 4.1.1 (64-bit)
```

まずは、必要なパッケージをインストールします。

```
# pip install twitter
# pip install elasticsearch
```

####マッピング
SQLみたいに、Elasticsearchも事前にデータ構造を決めた上で、データを投入しなければなりません。
Elasticsearchはindex-type-idの構造になっています。
データを投入する時に、indexとtypeは指定する必要がありますが、idは指定しなくていいです。
この場合は、自動で22桁のUUIDsが入ってきます。

|    SQL   |   Mongo  |  Elastic |
|:--------:|:--------:|:--------:|
|    DB    |    DB    |   index  |
|   table  |collection|   type   |

curlを使ってマッピングできますが、kibanaのDev Toolsではもっと便利だと思います。

```
PUT /twi_index
{
	"settings":{
		"index":{
			"analysis":{
			 	"tokenizer" : {
          				"kuromoji" : {
           					"type" : "kuromoji_tokenizer",
          					"mode" : "search"
          				}
         			},
				"analyzer" : {
          				"japanese" : {
            					"type": "custom",
            					"tokenizer" : "kuromoji",
            					"filter" : ["pos_filter"]
          				}
        			},
        			"filter" : {
          				"pos_filter" : {
            					"type" : "kuromoji_part_of_speech",
            					"stoptags" :["接続詞","助詞","助詞-格助詞","助詞-格助詞-一般","助詞-格助詞-引用","助詞-格助詞-連語","助詞-接続助詞","助詞-係助詞","助詞-副助詞","助詞-間投助詞","助詞-並立助詞","助詞-終助詞","助詞-副助詞／並立助詞／終助詞","助詞-連体化","助詞-副詞化","助詞-特殊","助動詞","記号","記号-一般","記号-読点","記号-句点","記号-空白","記号-括弧開","記号-括弧閉","その他-間投","フィラー","非言語音"]
          				}
        			}
			}
		}
	},
	"mappings": {
		"twi_type":{
			"properties":{
				"created_at" : {
					"type" : "date"
				},
				"text" : {
					"type" : "text",
					"analyzer": "japanese",
					 "fielddata": true 
				},
				"track": {
					"type": "keyword"
				}
			}
		}
	}
}
```

`settings`で`analyzer`を定義します。
`text`にはTwitter内容保存用として、日本語分析が必要なので、`analyzer`を指定します。
`track`は分析したくないので、typeは`keyword`を指定します。

kuromojiの設定方法は[こちら](https://github.com/elastic/elasticsearch-analysis-kuromoji/tree/v2.7.0/#version-270-for-elasticsearch-17)が参考になります。
ここでは、`kuromoji_part_of_speech`のフィルターを使って、特定の品詞（助詞、格助詞、記号）を除外します。


####データ投入
ほとんど丸ごとで[yoppeさんのスクリプト](http://qiita.com/yoppe/items/3e61fd567ae1d4c40a96#%E3%83%84%E3%82%A4%E3%83%BC%E3%83%88%E3%81%AE%E5%8F%8E%E9%9B%86)を使います。
ほんの少し修正したスクリプトは[Github](https://github.com/onlyzs89/elasticseach/blob/master/treand_stream.py)上に入れました。

####結果

ちょっと時間を経ってから、Kinabaでデータを確認しましょう。
データをkibanaにインポートします。
![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/144971/32ac854b-cbd9-8a36-7b55-4dbfc4eb8bcf.png)

Discover - trackを選択します。
Visualize - pie chart - twi_index

![bbb.png](https://qiita-image-store.s3.amazonaws.com/0/144971/be9dde8e-3580-6343-fe16-b61da8f09aa2.png)

この日（16/11/11）にテレビで「紅の豚」が放送されてたので、Twitterで話題になりました。( ´∀｀ )

*その他
　・`GET _aliases`を使って、index一覧をチェックできます。
　・[Field datatype](https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html)について
　　・2.xでテキストは`string`タイプを使用しますが、5.xからは`text`と`keyword`になっています。
>Keyword fields are only searchable by their exact value.
>If you need to index structured content such as email addresses, hostnames, status codes, or tags, it is likely that you should rather use a keyword field.

　　・`text`は分析が必要の際に使用、`keywors`は検索の際に完全一致の必要がある場合に使用します。

最後に、せっかくkuromojiを使ったので、効果を確認しましょう。

kuromojiを使わず：
![eee.png](https://qiita-image-store.s3.amazonaws.com/0/144971/99cd83c2-fdc8-8457-28ac-b3dfcf800620.png)

kuromojiを利用：
![ccc.png](https://qiita-image-store.s3.amazonaws.com/0/144971/6f0d7b31-4d13-6a61-218c-cbfc4e30c83f.png)

微妙だけど、少しよくました。
まぁ、Twitterで流している情報は専用名詞が多くあるから、ユーザ辞書を定義しないと、分析は難しいですね。


###2.地震情報

使用する情報源は[P2P地震情報さんが提供してるJSON API](http://www.p2pquake.com/dev/?q=json-api)です。

####マッピング

```
PUT /earthquakes
{
    "mappings": {
        "earthquake": {
            "properties": {
                "time": {
                    "type": "date",
                    "format":"yyyy/MM/dd HH:mm:ssZ"
                },
                "place": {
                    "type": "text" 
                },
                "location": {
                    "type": "geo_point"
                },
                "magnitude": {
                    "type": "float"
                },
                "depth": {
                    "type": "float"
                }
            }
        }
    }
}
```

####データ投入
スクリプトは[Github](https://github.com/onlyzs89/elasticseach/blob/master/import_earthquake.py)に置きました。
実は半年前に書いたコードなんです。
実行はできますけど、おかしなところもありますね。
時間があれば、直します。

####結果
Kibanaで確認しましょう。

![ddd.png](https://qiita-image-store.s3.amazonaws.com/0/144971/7ad3e6d5-c320-b30c-0134-e2a20e6d93db.png)



前編はここまでです。
後編の検索、スコアリングについてはどんなデータを分析しようかなを考えてます。