Elasticsearch 6.1.1のREST Clientを使ってみました(Java)

Elasticsearch とは



Elasticsearchとは、Elastic社が提供する「Lucene」ベースのオープンソース全文検索エンジンです。

全文検索エンジンとは、大量にあるドキュメントデータから、目的のワードを含むドキュメントデータを検索するための仕組みです。






やってみたこと



以前からElasticsearchが気になっていたこともあり、
Java向けのAPIでElasticsearchのデータの確認や追加ができるとのことなので、実際に試してみました。






Elasticsearch のインストール



現時点(2018/1/9)で最新のバージョン「6.1.1」をインストールしました。

最新バージョンの確認は下記サイトを参照しました。



www.elastic.co





下記コマンドを順番に実行します。




$ 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のインストール



先ほどと同様に、下記サイトで最新バージョンを確認しました。



www.elastic.co





下記コマンドを順番に実行します。




$ 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の詳しい操作手順は、下記を参照すると良いかと思います。



qiita.com






build.gradleに追加



Javaの実装をします。

build.gradleに下記を追加します。




dependencies {
compile 'org.elasticsearch.client:elasticsearch-rest-client-sniffer:6.1.1'
}





この手順は下記を参照しました。



www.elastic.co






ドキュメントの登録



JavaでElasticsearchにドキュメントを登録するよう実装します。

実装方法は下記チュートリアルを参照しました。

qbox.io





Jsonを生成するためにJsonデータの項目を持っているJavaオブジェクトクラスを作成しています。

Jsonの変換にはライブラリの「Gson」を使っています。使い方の詳細については下記の記事で紹介してあります。



mtomitomi.hatenablog.com





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の画面で実行すると、下記のようになります。



f:id:mtomitomi:20180108194836p:plain






やってみた感想



以前から気になっていたElasticsearchを初めて触ってみまして、Elasticsearchの概要は理解することができました。
Elasticsearchでできることについて奥が深そうなので、もっと調べてみたいと思います。



今回実装したRest Clientについては、Javaから操作することができるので、異なる環境からElasticsearchにアクセスしたい場合などに便利かと思います。
データの登録と削除以外にも、インデックスの操作など色々できそうです。

また、Kibanaを使ったデータの可視化が便利そうなので、今度試してみたいと思います。