ForgeVision Engineer Blog

フォージビジョン エンジニア ブログ

全文検索エンジン「Elasticsearch」を触ってみた

こんにちは、ソリューション技術部の佐藤です。
今回は「Elasticsearch」の記事1回目として、製品の紹介と導入手順を掲載します。

Elasticsearchとは

概要説明

 Elastic社が提供する「Elasticsearch」は、Apache Luceneをベースに開発されたオープンソース全文検索エンジンです。

「ユーザが、もっと簡単に、本当に欲しいものを検索できるように」というコンセプトから開発されており、データ型の柔軟性や検索速度、設定の容易さに優れています。

そもそも全文検索エンジンとは

 文字列に含まれるテキスト全体を対象とした検索を全文検索といい、検索対象のテキストからインデックスを作成し、文字列による検索を行うソフトウェアのことを、全文検索エンジンと呼びます。

今回紹介する「Elasticsearch」以外にも、「Apache Solr」や「Groonga」、AWS上で利用できる「Amazon CloudSearch」等の多数の製品があります。

Elasticsearchの特徴は?

 Elasticsearchの特徴としては、以下になります。

  • RESTful API
    • すべての操作はRESTful APIで実行します。
  • クラスタ構成
  • Elastic製品連携
    • Elasticsearchを含む「ElasticStack」と呼ばれるElastic社の製品群を利用することで、データ分析(取得・収集・蓄積・分析・可視化)を簡単に実現することができます。

ElasticStackについて

 今回紹介しているElasticsearchを中心としたElastic社のオープンソースプロダクト群です。以下の4製品を合わせてElasticStackと呼びます。

  • Elasticsearch
  • Kibana
    • データの解析/可視化ツール
  • Logstash
    • データの変換、統合、正規化、転送を行うデータパイプラインツール
  • Beats
    • エージェントとしてデータを収集・送信を行うデータシッパー

▼ざっくり製品連携まとめ f:id:k-hatae:20180308170055p:plain

バージョン情報

 2018年02月08日リリースのElasticStack 6.2.1 を利用します。また、データ確認用にKibanaも一緒にインストールします。

  • Elasticsearch 6.2.1
  • Kibana 6.2.1
  • 検証環境 CentOS Linux release 7.4.1708 × 3台

今回は、3台のノードをクラスタ化します。1台構成の場合はクラスタ化の手順を省略してください。

実際に導入してみる

CentosRed Hat等はRPMリポジトリ作ってインストールする方法が楽みたいなので、公式のリファレンスを参考に進めていきます。 www.elastic.co

レポジトリ追加

RPMインポート
$ rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearc
リポジトリ設定ファイルの作成
$ echo '[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' > /etc/yum.repos.d/elasticsearch-6.x.repo

インストール

 RPMリポジトリから「Elasticsearch」と「Kibana」をインストールします。

$ yum install elasticsearch
〜〜〜 中略 〜〜〜
Is this ok [y/d/N]: y
〜〜〜 中略 〜〜〜
インストール:
  elasticsearch.noarch 0:6.2.1-1
完了しました!

$ yum install Kibana
〜〜〜 中略 〜〜〜
Is this ok [y/d/N]: y
〜〜〜 中略 〜〜〜
インストール:
  kibana.x86_64 0:6.2.1-1
完了しました!

自動起動設定

 再起動時に自動起動するよう設定します。自動起動しなくて良い場合はスキップしてください。

$ systemctl enable elasticsearch.service
Created symlink from /etc/systemd/system/multi-user.target.wants/elasticsearch.service to /usr/lib/systemd/system/elasticsearch.service.
$ systemctl enable Kibana.service
Created symlink from /etc/systemd/system/multi-user.target.wants/kibana.service to /etc/systemd/system/kibana.service.

設定変更

Elasticsearch ネットワークホスト変更

 デフォルトではリモートホストからの接続を受け付けないため、外部から接続できるように設定します。

$ sed -i -e 's/#network.host: localhost/network.host: 0.0.0.0/g' /etc/elasticsearch/elasticsearch.yml
Kibana サーバホスト変更

 Kibanaも同様に。こちらは「server.host」を変更します。

$ sed -i -e 's/#server.host: "localhost"/server.host: "0.0.0.0"/g' /etc/kibana/kibana.yml

サービス再起動

$ service elasticsearch restart
$ service kibana restart

これでElasticsearchとKibanaのサービスが起動しました。

クラスタ化設定

 3台構成でない場合も、ノード指定・接続ノード数を変更すればクラスタ化可能です。

また、構成するすべての機器に以下の手順を実行してください。

 

クラスタ名統一

 クラスタ名を「sample-application」としています。適宜変更してください。

sed -i -e 's/#cluster.name: my-application/cluster.name: sample-application/g'/etc/elasticsearch/elasticsearch.yml
ノード名設定

 「node-XXX」となっている個所をノードごとに別名を付けて実行してください。

sed -i -e 's/#node.name: node-1/node.name: node-XXX/g' /etc/elasticsearch/elasticsearch.yml

例:node-1、node-2、node-3

ノード指定

「"host1 ", "host2", "host3"」となっている個所を各ノードのipアドレスに変更して実行してください。

sed -i -e 's/#discovery.zen.ping.unicast.hosts: ¥["host1", "host2"¥]/discovery.zen.ping.unicast.hosts:["host1 ", "host2", "host3"]/g' /etc/elasticsearch/elasticsearch.yml
接続ノード数設定

「ノード数/2+1」となる値を「XX」に設定してください。3台の場合は「2」となります。

sed -i -e 's/#discovery.zen.minimum_master_nodes: 3/discovery.zen.minimum_master_nodes: XX/g' /etc/elasticsearch/elasticsearch.yml
再起動
sudo systemctl restart elasticsearch
sudo systemctl restart kibana
クラスタ化確認

 以下のコマンドを入力して、「"number_of_nodes" : ノード数」になっていればクラスタ化成功です。

curl --ipv4 http://localhost:9200/_cluster/health?pretty
{
  "cluster_name" : "elasticsearch",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 3
  "number_of_data_nodes" : 3,
  "active_primary_shards" : 0,
  "active_shards" : 0,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}

動作確認

試しにインデックスとドキュメントを作成してみます。

RDBでいうところのテーブルとレコードです)

インデックス作成

$ curl -XPUT localhost:9200/test-index001?pretty
{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "test-index001"
}

ドキュメント作成

$ curl -XPOST localhost:9200/test-index001/log?pretty  -H 'Content-Type: application/json' -d '
$ {
$  "@timestamp": "2018-01-09T09:35:29.690Z",
$  "hostname": "test01",
$  "level": "Warning",
$  "code": "901",
$  "message": "Warning test 901."
$ }
$ '
{
  "_index" : "test-index001",
  "_type" : "log",
  "_id" : "1TwYCmIB395UdOTmeZLO",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}

Elasticsearchで確認

$ curl -XGET localhost:9200/_cat/indices?v
health status index         uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   test-index001 4Cyu9BSOR3C4ZtlQnjUt1A   5   1          0            0       460b           460bhttp://192.168.2.131:5601

インデックス「test-index001」の「docs.count」が1になっていることが確認できました。

Kibanaで確認

  1. 「http://[Kibanaのipアドレス]:5601」に接続

  2. Management > Index Patterns > Index pattern に「test-index*」を入力し、Next step を押下 f:id:k-hatae:20180309183911p:plain

  3. 「Time Filter field name」に「@timestamp」を選択し、「Create index pattern」を押下 f:id:k-hatae:20180309184123p:plain

  4. ドキュメントの作成から15分以上経っているとデータが表示されないので、右上の「Last 15 minutes」を「Last 5 years」に変更することで、全件を表示 f:id:k-hatae:20180309184402p:plain

  5. ドキュメントが表示されました! f:id:k-hatae:20180309184647p:plain

終わりに

全文検索エンジン「Elasticsearch」の概要と導入手順でした。

またどこかのタイミングで、ここからさらに色々なデータを取り込んで楽しいことをする記事を書きたいと思います。

最後までお付き合い頂きありがとうございました!