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コンテナで動かせるものなら、どんなものでも、テストのためだけに、手軽に立ち上げ、使い終わったら綺麗に片付けてくれる、まるで敏腕マネージャーのような存在です。


ディズニーランド級の楽しさ!Spring Bootで叶えるストレスフリーなJava開発

もしあなたが「JavaでWebアプリケーションを作りたいけど、設定とか色々難しそう…」「もっとサクサク開発を進めたい!」と思っているなら、Spring Bootはまさにあなたのための魔法のツールです!ディズニーランドで例えるなら、Spring Bootは「夢と魔法の王国を、あっという間に作り上げられる設計図と建設キット」みたいなものです。普通なら、お城を建てるのに、レンガを一つ一つ積んだり、電気配線をしたり…と大変ですよね?でもSpring Bootがあれば、基本的な骨組みはもうできていて、あなたは「どんなお城にしたいか」という創造的な部分に集中できるんです!


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

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


バグに疲れたJava開発者へ贈る、Spring AIベースの「賢いチーム」構築法

私も「またバグかよ!」って叫びたくなる気持ち、よーく分かります。そんなバグ潰しに疲弊した心を癒し、次の段階、つまり「バグを生み出す前に、賢い自動化エージェントに任せちゃおう」という世界へ導いてくれるかもしれないのが、今回解説する 「アリババクラウドが提供する、Spring AIベースのエージェントAIフレームワーク」です!


開発効率を劇的に上げる!iluwatarのデザインパターンで保守性の高いJavaコードを書く

これは、GitHubで公開されているJavaのデザインパターン集で、「iluwatar/java-design-patterns」 という名前で知られています。「iluwatar/java-design-patterns」は、単なるコードのコレクションではなく、「設計の知恵」 が詰まったレシピ集です。ソフトウェアエンジニアの視点から、これがどのように役立つかを見ていきましょう。


さよなら、データ処理バグ!ThingsBoardのルールエンジンで叶えるノーコードIoTロジック

ThingsBoardは、その名の通り「モノ」のデータを扱うための強力なオープンソースのIoTプラットフォームです。特に、データ収集、処理、そして「見える化」に特化しており、ソフトウェアエンジニアの視点から見ると、非常に頼りになるツールと言えます。


「TheAlgorithms/Java」徹底解説:実践的なアルゴリズム活用法

こんにちは!今回はソフトウェアエンジニアの皆さんにとって非常に興味深いプロジェクト、「TheAlgorithms/Java」についてお話しします。このプロジェクトは、Javaで実装された様々なアルゴリズムやデータ構造をまとめた、オープンソースのリポジトリです。まるでアルゴリズムのペットショップのように、いろんな種類のかわいい(?)アルゴリズムたちが揃っています。


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

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


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

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


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

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