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




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

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


Kotlin/Javaで賢いAIエージェント作成!embabel-agent活用でゲームの達人に?コントの帝王に?

まず、embabel-agentを一言で言うと、「JVM上で動く、賢いエージェント(代理人)を作るためのフレームワーク」です。KotlinやJava、Springといった技術を使って、まるでAIが動いているかのようなアプリケーションを作ることができます。


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

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


AIがもたらす開発革命:Perplexicaで技術の海を航海せよ

これは、とあるソフトウェア開発チーム、「エボリューション・ワークス」の物語です。彼らはいつも新しい技術を探求し、より良いプロダクトを作ろうと奮闘していました。しかし、彼らの開発環境には、大きな課題がありました。それは「情報の断片化」です。新しいライブラリやフレームワークを使おうとすると、公式サイト、Stack Overflow、GitHubのissue、技術ブログなど、あちこちのサイトを巡回して情報を集めなければなりませんでした。まるで「宝探し」のようです。


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

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


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

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


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

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


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

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


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

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