Elasticsearch とは
Elasticsearchとは、Elastic社が提供する「Lucene」ベースのオープンソース全文検索エンジンです。
全文検索エンジンとは、大量にあるドキュメントデータから、目的のワードを含むドキュメントデータを検索するための仕組みです。
やってみたこと
以前からElasticsearchが気になっていたこともあり、
Java向けのAPIでElasticsearchのデータの確認や追加ができるとのことなので、実際に試してみました。
Elasticsearch のインストール
現時点(2018/1/9)で最新のバージョン「6.1.1」をインストールしました。
最新バージョンの確認は下記サイトを参照しました。
下記コマンドを順番に実行します。
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.1.1.tar.gz
$ tar -xzf elasticsearch-6.1.1.tar.gz
$ cd elasticsearch-6.1.1
$ bin/elasticsearch-plugin install analysis-kuromoji
$ bin/elasticsearch
最後のコマンド実行後にstarting ...
と表示されていれば大丈夫です。
ブラウザで http://localhost:9200/ にアクセスし、Jsonが表示されていれば正常に起動できています。
Kibanaのインストール
先ほどと同様に、下記サイトで最新バージョンを確認しました。
下記コマンドを順番に実行します。
$ wget https://artifacts.elastic.co/downloads/kibana/kibana-6.1.1-darwin-x86_64.tar.gz
$ tar -xzf kibana-6.1.1-darwin-x86_64.tar.gz
$ cd kibana-6.1.1-darwin-x86_64
$ bin/kibana
最後のコマンド実行後に[info][listening] Server running ....
と表示されていれば大丈夫です。
ブラウザで http://localhost:5601/ にアクセスし、Kibanaの画面が表示されていれば正常に起動できています。
Kibanaの詳しい操作手順は、下記を参照すると良いかと思います。
build.gradleに追加
Javaの実装をします。
build.gradleに下記を追加します。
dependencies {
compile 'org.elasticsearch.client:elasticsearch-rest-client-sniffer:6.1.1'
}
この手順は下記を参照しました。
ドキュメントの登録
JavaでElasticsearchにドキュメントを登録するよう実装します。
実装方法は下記チュートリアルを参照しました。
qbox.io
Jsonを生成するためにJsonデータの項目を持っているJavaオブジェクトクラスを作成しています。
Jsonの変換にはライブラリの「Gson」を使っています。使い方の詳細については下記の記事で紹介してあります。
ElasticSearchPutRestClient.java
package kibana;
import com.google.gson.Gson;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.entity.ContentType;
import org.apache.http.nio.entity.NStringEntity;
import org.apache.http.util.EntityUtils;
import org.elasticsearch.client.Response;
import org.elasticsearch.client.RestClient;
import java.io.IOException;
import java.util.Collections;
public class ElasticSearchPutRestClient {
public static void main(String[] args) {
//登録するデータを生成
Gson gson = new Gson();
Book book = new Book("Pakaan", new Name("Taro", "Momo"));
RestClient client = RestClient.builder(new HttpHost("localhost", 9200)).build();
HttpEntity entity = new NStringEntity(
gson.toJson(book), ContentType.APPLICATION_JSON);
try {
Response indexResponse = null;
indexResponse = client.performRequest(
"PUT",
"/library/books/2",
Collections.<String, String>emptyMap(),
entity);
System.out.println(EntityUtils.toString(indexResponse.getEntity()));
} catch (IOException e) {
e.printStackTrace();
}
}
}
Book.java
package kibana;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class Book {
private String title;
private Name name;
}
Name.java
package kibana;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class Name {
private String first;
private String last;
}
実行して下記のようなJsonが返却されたら、正常に登録できています。
<実行結果>
{"_index":"library","_type":"books","_id":"2","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":0,"_primary_term":2}
ドキュメントの取得
前手順で登録したドキュメントを取得するよう実装します。
検索対象を指定するときにparamMap.put
で「q」を指定すると、検索クエリになります。
「pretty」を指定すると、取得したJsonが整形されます。
ElasticSearchGetRestClient.java
package kibana;
import org.apache.http.HttpHost;
import org.apache.http.util.EntityUtils;
import org.elasticsearch.client.Response;
import org.elasticsearch.client.RestClient;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class ElasticSearchGetRestClient {
public static void main(String[] args) {
RestClient client = RestClient.builder(new HttpHost("localhost", 9200)).build();
Map<String, String> paramMap = new HashMap<>();
paramMap.put("q", "title:Pakaan"); //検索クエリ
paramMap.put("pretty", "true"); //整形される
try {
Response response = client.performRequest("GET", "/library/_search", paramMap);
System.out.println(EntityUtils.toString(response.getEntity()));
System.out.println("Host - " + response.getHost());
System.out.println("RequestLine - " + response.getRequestLine());
} catch (IOException e) {
e.printStackTrace();
}
}
}
実行すると、先ほど登録したデータを取得することができました。
<実行結果>
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 0.2876821,
"hits" : [
{
"_index" : "library",
"_type" : "books",
"_id" : "2",
"_score" : 0.2876821,
"_source" : {
"title" : "Pakaan",
"name" : {
"first" : "Taro",
"last" : "Momo"
}
}
}
]
}
}
Host - http://localhost:9200
RequestLine - GET /library/_search?q=title%3APakaan&pretty=true HTTP/1.1
登録したデータの取得をKibanaの画面で実行すると、下記のようになります。
やってみた感想
以前から気になっていたElasticsearchを初めて触ってみまして、Elasticsearchの概要は理解することができました。
Elasticsearchでできることについて奥が深そうなので、もっと調べてみたいと思います。
今回実装したRest Clientについては、Javaから操作することができるので、異なる環境からElasticsearchにアクセスしたい場合などに便利かと思います。
データの登録と削除以外にも、インデックスの操作など色々できそうです。
また、Kibanaを使ったデータの可視化が便利そうなので、今度試してみたいと思います。