Elasticsearch: Java開発者のためのRESTful検索エンジン導入ガイド
Elasticsearchは、大量のデータから特定の情報を素早く、そして柔軟に検索するための分散型RESTful検索エンジンです。 単なるデータベースではなく、検索に特化しているのが最大の特徴。
Free and Open Source
無料で利用でき、ソースコードも公開されているので、安心して使えます。
Distributed
データを複数のサーバーに分散して保存できるため、スケーラビリティと耐障害性に優れています。
RESTful
HTTPリクエストを通じて簡単に操作できるので、様々なプログラミング言語からアクセスしやすいです。
Search Engine
全文検索はもちろん、構造化データや非構造化データも高速に検索できます。
Elasticsearchは、ただデータを保存するだけでなく、そのデータを「活用」するための強力なツールです。
データベースでLIKE句を使って全文検索をすると、データ量が増えるにつれてパフォーマンスが著しく低下します。Elasticsearchは、事前にインデックスを作成することで、ミリ秒単位で検索結果を返します。
これは、まるで膨大な書籍の中からキーワードでページを検索する「索引」を事前に作っておくようなものです。
ただのキーワード検索だけでなく、以下のような高度な検索が可能です。
ファセット検索(絞り込み検索)
ECサイトで色やサイズ、価格帯などで絞り込む機能です。
オートコンプリート
入力途中に候補を提示する機能です。
Geospatial検索
地図上で特定の場所に近いものを探す機能です。
WebサーバーのログやアプリケーションのエラーログなどをElasticsearchに集約すれば、リアルタイムでログを検索・分析できます。 Kibana(Elasticsearchと連携する可視化ツール)を使えば、グラフやダッシュボードで分かりやすく可視化できます。
Elasticsearchを始めるには、Dockerを使うのが一番手軽で簡単です。
まず、Dockerがインストールされていることを確認してください。
# Docker Composeファイルを作成
touch docker-compose.yml
docker-compose.ymlファイルに以下を記述します。
version: '3.8'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.10.2
container_name: elasticsearch
environment:
- xpack.security.enabled=false
- discovery.type=single-node
ports:
- 9200:9200
volumes:
- es_data:/usr/share/elasticsearch/data
volumes:
es_data:
driver: local
次に、このファイルを保存して、ターミナルで以下のコマンドを実行します。
docker-compose up -d
これで、Elasticsearchのインスタンスがlocalhost:9200で起動します。
javaとsearch-engineのタグが付いているので、Javaでの使い方を解説します。
Elasticsearchの公式JavaクライアントであるElasticsearch Java API Clientを使います。
Maven (pom.xml)への依存関係の追加
<dependency>
<groupId>co.elastic.clients</groupId>
<artifactId>elasticsearch-java</artifactId>
<version>8.10.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.32</version>
</dependency>
サンプルコード
以下のJavaコードは、ドキュメントのインデックス作成と検索を行う例です。
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.core.SearchResponse;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.rest.RestClientTransport;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import java.io.IOException;
public class ElasticsearchExample {
public static void main(String[] args) throws IOException {
// Elasticsearchクライアントの初期化
RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();
ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
String indexName = "my_documents";
// 1. ドキュメントのインデックス作成
// JSON形式のデータをJavaのPOJO(Plain Old Java Object)として扱う
client.index(i -> i
.index(indexName)
.id("1")
.document(new Document("Elasticsearch", "素晴らしい検索エンジンです!"))
);
System.out.println("ドキュメントをインデックス化しました。");
// 2. 検索の実行
SearchResponse<Document> response = client.search(s -> s
.index(indexName)
.query(q -> q
.match(t -> t
.field("title")
.query("Elasticsearch")
)
),
Document.class
);
System.out.println("検索結果:");
response.hits().hits().forEach(hit ->
System.out.println("スコア: " + hit.score() + ", ドキュメント: " + hit.source())
);
// クライアントのクローズ
transport.close();
restClient.close();
}
// ドキュメントを表すPOJO
private static class Document {
private String title;
private String content;
public Document(String title, String content) {
this.title = title;
this.content = content;
}
public Document() {} // Jacksonのために必要
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }
public String getContent() { return content; }
public void setContent(String content) { this.content = content; }
@Override
public String toString() {
return "Document{" +
"title='" + title + '\'' +
", content='" + content + '\'' +
'}';
}
}
}
このコードでは、my_documentsというインデックスにドキュメントを1つ追加し、titleフィールドに"Elasticsearch"という単語を含むものを検索しています。