Elasticsearch: Java開発者のためのRESTful検索エンジン導入ガイド


Elasticsearch: Java開発者のためのRESTful検索エンジン導入ガイド

elastic/elasticsearch

2025-09-23

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で起動します。

javasearch-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"という単語を含むものを検索しています。


elastic/elasticsearch




Testcontainers導入ガイド:Javaテストにおける環境依存性の悩みを解消する魔法のライブラリ

今回解説するのは、Javaのテストの世界で絶大な人気を誇るライブラリ、Testcontainersです。Testcontainersは、Javaのユニットテストや統合テストをサポートするためのライブラリです。「推し」がDockerコンテナで動かせるものなら、どんなものでも、テストのためだけに、手軽に立ち上げ、使い終わったら綺麗に片付けてくれる、まるで敏腕マネージャーのような存在です。


面接官を唸らせる!ローカル完結型PDFツール「Stirling-PDF」徹底解説

面接官本日は当社の面接にお越しいただき、ありがとうございます。面接官の山田と申します。あなた本日は貴重な機会をいただき、誠にありがとうございます!エンジニアの佐藤と申します!面接官佐藤さん、今日は何かユニークな技術について、ご自身の言葉でプレゼンしていただきたいのですが、よろしいでしょうか?


【エンジニア必見】オープンソースRTS「Mindustry」のコードベースを深掘り

ただし、「逆に、」を口癖のように使うのは少し難しいかもしれませんが、そのプロジェクトが持つ双方向の学びの機会や異なる視点を強調する形で、解説の中に織り交ぜていきますね。Mindustry は、タワーディフェンスと資源管理、自動化が組み合わさったリアルタイムストラテジー(RTS)ゲームです。


もうリモートを意識しない。XPipeで実現するシームレスなサーバー管理術

お前、散らばったサーバーの鍵(SSHキー)や、どこにあるかもわからねぇDockerコンテナ、それにKubernetesのクラスターの管理で、頭がパンクしそうになってるんだろ?俺たち「裏のエンジニア」にとっちゃ、証拠を残さず、素早く、スマートにターゲット(サーバー)へ潜り込むのが鉄則だ。そこで使えるのが、この 「XPipe」 って代物さ。


Kestra: ソフトウェア開発を効率化するワークフロー自動化ツール

ソフトウェアエンジニアの皆さん、こんにちは!Kestra について、まるで酒の飲み比べをするように、その特徴と魅力を分かりやすく解説します。今回は、特に Kestra を「仕事の効率を上げる最高の一杯」と見立てて、その味わいを深く探っていきましょう。


ソフトウェアエンジニア必見! MCPでAI開発の密室を突破する

おいおい、一体どういうことだ!? この部屋は完全に密室じゃないか!…おっと、すみません。ついドラマの役に入り込んでしまいました。でも、この密室、実は我々ソフトウェアエンジニアの目の前にある「AI開発の密室」かもしれません。「ん? AIの密室ってどういうこと?」と、あなたは首を傾げていますね。ご説明しましょう。


脱・追跡広告!Organic Mapsと歩む、誠実なソフトウェアエンジニアリングへの道

エンジニアにとってのこのライブラリは、まるで「道に迷った時にそっと現れる、信頼できるベテランガイド」のような存在だよ。星座占いの運勢風に、その魅力と使い方を紐解いていくね!今日のあなたの運勢は「開拓」がキーワード。 重たいクラウドSDKや、プライバシーを切り売りする広告モデルに疲れていないかな?Organic Maps を手に取ることで、あなたのアプリ開発に「ピュアな自由」がもたらされる暗示が出ているよ。


エンジニア必見!分散システムを楽にするConductor入門:居酒屋から始めるオーケストレーション

大将、ちょっと聞いてくれよ!このConductorってやつが、俺たちの仕事にめっちゃ役立ちそうなんだ。Conductorは、複雑なワークフローを管理するための強力なオーケストレーションプラットフォームだ。マイクロサービスを組み合わせて一つの大きな処理を実行するとき、サービスの呼び出し順序や、途中でエラーが起きたときのリカバリ処理を自動でやってくれるんだ。例えるなら、居酒屋の大将が、お客さんの注文(ワークフロー)を受けて、焼き鳥担当、刺身担当、ドリンク担当(マイクロサービス)に的確に指示を出し、どのタイミングで何を作るか、もし材料が切れたらどうするか、といった全体を仕切る役目を自動でやってくれるようなもんだ。


【MySQL, Java開発者必見】DBeaverで実現するユニバーサルなデータベース管理とデバッグ術

DBeaverは、MySQLだけでなく、PostgreSQL, Oracle, SQL Server, SQLiteなど、ほぼすべての主要なデータベースに対応したユニバーサルなデータベース管理ツール(SQLクライアント)です。特にソフトウェアエンジニアにとっては、開発やデバッグ作業を効率化するための非常に強力な味方になります。