Oracle Cloud Infrastructure環境にElasticsearchとSudachiプラグインをインストール


ElasticsearchとKibana、形態素解析エンジンとしてSudachiをインストールしたログです。
以下を参考にしました。

- [Elasticsearch で Sudachi 使う] (https://whitech0c0late.hatenablog.com/entry/2018/05/13/235137)
- [Elasticsearchのための新しい形態素解析器 「Sudachi」](https://qiita.com/sorami/items/99604ef105f13d2d472b)
- [Install Elasticsearch with RPM]
(https://www.elastic.co/guide/en/elasticsearch/reference/current/rpm.html)

※お試し環境なので可用性・セキュリティは考慮していません。

# 使用した環境

[インスタンスを作成する - Oracle Cloud Infrastructureを使ってみよう(その3)]
(https://community.oracle.com/docs/DOC-1019204) を参考に、VCN(仮想クラウドネットワーク)を作成し、VM(Computeインスタンス)を作成。

OS：Oracle Linux 7.x (最新のもの) を選択

インスタンス作成後、Public IPアドレスと、Private IPアドレスを確認しておく。
(Compute >> Instances >> Instance Details)

# インストール

Javaのインストール。rpmを別途ダウンロードして以下を実行

```
# mkdir /usr/java
# cd /usr/java/
# rpm -ivh jre-8u191-linux-x64.rpm
```

/etc/yum.repos.d/elasticsearch.repo を以下の内容で作成

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

Elasticsearch 6.2.0をインストール
(Sudachiプラグインが、最新バージョンのElasticsearchには対応していないようでインストールに失敗したので、Elasticsearchのバージョンを明示的に指定してyum install)

```
# yum --showduplicates search elasticsearch (※install可能なバージョンを確認)
# yum install elasticsearch-6.2.0-1.noarch
```

Sudachiプラグインインストール

```
# yum install maven
# yum install git
# git clone https://github.com/WorksApplications/elasticsearch-sudachi.git
# cd elasticsearch-sudachi/
# mvn package
# /usr/share/elasticsearch/bin/elasticsearch-plugin install file:///root/elasticsearch-sudachi/target/releases/analysis-sudachi-elasticsearch6.2-1.1.0-SNAPSHOT.zip
```

Kibanaインストール(バージョンを6.2.0に合わせる)

```
# yum --showduplicates search kibana 
# yum install kibana-6.2.0-1.x86_64
```

# 起動

以下の確認により、systemctlを使用して起動する

```
$ ps -p 1
  PID TTY          TIME CMD
    1 ?        00:00:02 systemd
```

Elasticsearch起動

```
# /bin/systemctl daemon-reload
# /bin/systemctl enable elasticsearch.service
Created symlink from /etc/systemd/system/multi-user.target.wants/elasticsearch.service to /usr/lib/systemd/system/elasticsearch.service.
# systemctl start elasticsearch.service
```

Kibana起動

```
# /bin/systemctl daemon-reload
# /bin/systemctl enable kibana.service
Created symlink from /etc/systemd/system/multi-user.target.wants/kibana.service to /etc/systemd/system/kibana.service.
# systemctl start kibana.service
```



# 動作確認

Elasticsearch起動確認

```
# curl -X GET "localhost:9200/"
{
  "name" : "RTk9yAi",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "PtV0gqoQQsGjMa-fBZ1Uhw",
  "version" : {
    "number" : "6.2.0",
    "build_hash" : "37cdac1",
    "build_date" : "2018-02-01T17:31:12.527918Z",
    "build_snapshot" : false,
    "lucene_version" : "7.2.1",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}
```

Sudachiプラグイン確認

```
# curl -X GET 'http://localhost:9200/_nodes/plugins?pretty'
{
  "_nodes" : {
    "total" : 1,
..(中略)..
      "plugins" : [        {
          "name" : "analysis-sudachi",
          "version" : "1.1.0-SNAPSHOT",
          "description" : "The Japanese (Sudachi) Analysis plugin integrates Lucene Sudachi analysis module into elasticsearch.",
          "classname" : "com.worksap.nlp.elasticsearch.sudachi.plugin.AnalysisSudachiPlugin",
          "extended_plugins" : [ ],
          "has_native_controller" : false,
          "requires_keystore" : false
        }
      ],
```

Sudachiの辞書ファイルのダウンロードと配置

```
# wget https://oss.sonatype.org/content/repositories/snapshots/com/worksap/nlp/sudachi/0.1.1-SNAPSHOT/sudachi-0.1.1-20181108.091011-45-dictionary-core.zip
# mkdir /etc/elasticsearch/sudachi_tokenizer/
# unzip sudachi-0.1.1-20181108.091011-45-dictionary-core.zip
# mv system_core.dic /etc/elasticsearch/sudachi_tokenizer/
```

sudachi_testという名前のindex作成 (まずは以下の内容でsudachi.json作成)

```:sudachi.json
{
  "settings": {
    "index": {
      "analysis": {
        "tokenizer": {
          "sudachi_tokenizer": {
            "type": "sudachi_tokenizer",
            "mode": "search",
            "discard_punctuation": true
          }
        },
        "analyzer": {
          "sudachi_analyzer": {
            "filter": [
            ],
            "tokenizer": "sudachi_tokenizer",
            "type": "custom"
          }
        }
      }
    }
  }
}
```

sudachi_testという名前のindex作成

```
$ curl -X PUT -H "Content-Type: application/json" http://localhost:9200/sudachi_test/ -d @sudachi.json
{"acknowledged":true,"shards_acknowledged":true,"index":"sudachi_test"}
```

# Sudachiの動作を見てみる

「すももももももももものうち」という文字列を入力

## Sudachiを使う場合

```
$ curl -X POST -H "Content-Type: application/json" 'localhost:9200/sudachi_test/_analyze?pretty' -d '{"analyzer": "sudachi_analyzer", "text": "すもももももももものうち"}'
```

### 結果

完璧♪

```
{
  "tokens" : [
    {
      "token" : "すもも",
      "start_offset" : 0,
      "end_offset" : 3,
      "type" : "word",
      "position" : 0
    },
    {
      "token" : "も",
      "start_offset" : 3,
      "end_offset" : 4,
      "type" : "word",
      "position" : 1
    },
    {
      "token" : "もも",
      "start_offset" : 4,
      "end_offset" : 6,
      "type" : "word",
      "position" : 2
    },
    {
      "token" : "も",
      "start_offset" : 6,
      "end_offset" : 7,
      "type" : "word",
      "position" : 3
    },
    {
      "token" : "もも",
      "start_offset" : 7,
      "end_offset" : 9,
      "type" : "word",
      "position" : 4
    },
    {
      "token" : "の",
      "start_offset" : 9,
      "end_offset" : 10,
      "type" : "word",
      "position" : 5
    },
    {
      "token" : "うち",
      "start_offset" : 10,
      "end_offset" : 12,
      "type" : "word",
      "position" : 6
    }
  ]
}
```


## Sudachiを使わない場合(stadardアナライザの利用)

```
$ curl -X POST -H "Content-Type: application/json" 'localhost:9200/sudachi_test/_analyze?pretty' -d '{"analyzer": "standard", "text": "すもももももももものうち"}'
```

### 結果

1文字ずつ分割されている

```
{
  "tokens" : [
    {
      "token" : "す",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "<HIRAGANA>",
      "position" : 0
    },
    {
      "token" : "も",
      "start_offset" : 1,
      "end_offset" : 2,
      "type" : "<HIRAGANA>",
      "position" : 1
    },
    {
      "token" : "も",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "<HIRAGANA>",
      "position" : 2
    },
    {
      "token" : "も",
      "start_offset" : 3,
      "end_offset" : 4,
      "type" : "<HIRAGANA>",
      "position" : 3
    },
    {
      "token" : "も",
      "start_offset" : 4,
      "end_offset" : 5,
      "type" : "<HIRAGANA>",
      "position" : 4
    },
    {
      "token" : "も",
      "start_offset" : 5,
      "end_offset" : 6,
      "type" : "<HIRAGANA>",
      "position" : 5
    },
    {
      "token" : "も",
      "start_offset" : 6,
      "end_offset" : 7,
      "type" : "<HIRAGANA>",
      "position" : 6
    },
    {
      "token" : "も",
      "start_offset" : 7,
      "end_offset" : 8,
      "type" : "<HIRAGANA>",
      "position" : 7
    },
    {
      "token" : "も",
      "start_offset" : 8,
      "end_offset" : 9,
      "type" : "<HIRAGANA>",
      "position" : 8
    },
    {
      "token" : "も",
      "start_offset" : 9,
      "end_offset" : 10,
      "type" : "<HIRAGANA>",
      "position" : 9
    },
    {
      "token" : "の",
      "start_offset" : 10,
      "end_offset" : 11,
      "type" : "<HIRAGANA>",
      "position" : 10
    },
    {
      "token" : "う",
      "start_offset" : 11,
      "end_offset" : 12,
      "type" : "<HIRAGANA>",
      "position" : 11
    },
    {
      "token" : "ち",
      "start_offset" : 12,
      "end_offset" : 13,
      "type" : "<HIRAGANA>",
      "position" : 12
    }
  ]
}
```

# リモートからもつながるように設定変更

Elasticsearch(PORT:9200)は、localhostにバインドして起動する設定のため、localhostからしか接続できないようになっていました。
Kibana(PORT:5601)も、最初の設定ではlocalhostからしか接続できないようになっていました。

## Elasticsearch, Kibanaの設定ファイル変更し再起動

設定ファイルを変更（必要に応じて元のファイルをcpしてオリジナル版を残しておく）

```:/etc/elasticsearch/elasticsearch.ymlの変更箇所
network.host: 0.0.0.0
```

```:/etc/kibana/kibana.ymlの変更箇所
server.host: "0.0.0.0"
elasticsearch.url: "http://<PUBLIC_IP_ADDRESS>:9200"
```

```
# systemctl restart elasticsearch.service
# systemctl restart kibana.service
```

## このクラウド環境固有の設定変更

### ComputeインスタンスのFirewallの設定
デフォルトではSSHサービス以外は全て閉じられているので使用するポートを許可する

```
# firewall-cmd --list-ports (※現状確認：何も無い)

# firewall-cmd --permanent --add-port=5601/tcp
success
# firewall-cmd --permanent --add-port=9200/tcp
success
# firewall-cmd --reload
success
# firewall-cmd --list-ports
5601/tcp 9200/tcp
```

### Oracle CloudのVCNの設定で、特定PORTへのアクセスを許可

- KibanaへのPORT(5601)を開放
- ElasticsearchのPORT(9200)も一緒に開放

Networking >> Virtual Cloud Networks >> Virtual Cloud Network Details より
「**Security Lists**」をクリックし、以下の画面に。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/297987/fa05ab2b-e627-552f-0752-bc8d5ee72387.png)

「**View Security List Details**」をクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/297987/d5be3793-edc9-cc1a-5896-1cf64a384f59.png)

「**Edit All Rules**」をクリックし、Ingressルールの一番下にある「**+ Another Ingress Rules**」をクリックし、以下のように全IPアドレス(0.0.0.0)からPORT:5601を追加。
(※アクセスするIPアドレスがわかっている場合は絞って指定)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/297987/3823a714-aca5-980a-7f6c-8e440bd750f6.png)

**PORT:9200 も同様に追加**する。
最後に、一番下にある「**Save Security List Rules**」を忘れずにクリックし保存。

# Kibanaにリモートからアクセス

手元のPCから、http://PUBLIC_IP_ADDRESS:5601/ 

![image.png](https://qiita-image-store.s3.amazonaws.com/0/297987/e300a0fa-9585-fbfe-e5a2-c8d2c4da48f8.png)

アクセス成功。
Dev Tools → 「すもももももももものうち」を入力してみたところ。

# 追記

設定の続き。
[Elasticsearch + Logstash + Kibana + SudachiプラグインでTwitterを可視化したときのtemplate](https://qiita.com/mikika/items/1e83c97865c3148b3a7b)