Gluegent Blog

Gluegent Blog

Elasticsearch Java API Clientを触ってみた

  • 技術
Elasticsearch Java API Clientを触ってみた

こんにちは。新卒二年目エンジニアの土屋です。

業務においてElasticsearchのJava API Clientに触ってみる機会がありましたので、使用方法等簡単にまとめてブログにしてみました!

Elasticsearchとは

Elastic社によって開発された高速で動く検索・分析エンジンです。オープンソースの検索エンジンライブラリであるApache Luceneをベースに構築されており、LogstashやKibanaといったElastic Stackのツールを使うことで容易にデータ投入からエンリッチメント、保管、分析、可視化が可能です。

使用環境

今回は下記の環境でElasticsearch Java API Clientを利用しました

  • Windows 10
  • Java 8
  • Elasticsearch : 8.6.1
  • elasticsearch-java : 8.8.1

Elasticsearchは個人のローカル環境でもGCPやAWSなどの環境でも使用可能ですが、今回はGCP上のElasticsearchをローカルから接続して使用しています。(Elasticsearchの構築方法は省略)

事前準備

JavaでElasticsearch Java API Clientを使用するためのライブラリであるelasticsearch-javaや依存ライブラリのインストール方法や指定のエンドポイントへの接続方法に関してはこちらを参考に設定しました。

基本用語

Elasticsearchは検索が強力なデータベースのようなものです。厳密には異なりますが、ここではRDBの用語と対応させてまとめてみました。

Java API Clientを使ってElasticsearchを操作する

ここからが本題です。Elasticsearch Java API Clientを使用してElasticsearchへのドキュメントの登録や検索の仕方を説明していきます。Javaコード中に出てくるesClientに関しては事前準備の段階で取得しているものとします。

インデックスの作成方法

インデックスは以下の方法で作成できます。ここでは『books』というインデックスを作成しています。

esClient.indices().create(c -> c
    .index("books")
);

ドキュメントの登録方法

今回はJavaで作成したDTOクラスのBookを使用します。

public class Book {
    public Book() {
    }

    private String name;
    private String author;
    private Date releaseDate;
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public Date getReleaseDate() {
        return releaseDate;
    }
   
    public void setReleaseDate(Date releaseDate) {
        this.releaseDate = releaseDate;
    }
}

Bookクラスのオブジェクトをidに1を指定して『books』インデックスに登録するコードは以下のようになります。

Book book = new Book();
book.setName("本A");
book.setAuthor("鈴木 太郎");

esClient.index(i -> i
    .index("books")
    .id(1)
    .document(book)
);

『books』インデックスの作成後に実行する場合は、『books』インデックスにドキュメントが登録されますが、『books』インデックスの作成前に上記コードを実行すると『books』インデックスの作成も同時に行われます。また、idを指定しない場合はElasticsearchでランダムにidが付与されます。idはインデックス内で一意であるため既存のidを指定した場合はドキュメントの中身が更新されます(上書き)。既存のidの場合は更新したくない場合はesClient.index()ではなくesClient.create()を使用する必要があります。なお、esClient.create()は指定IDのドキュメントが既に存在している場合、例外が発生します。

ドキュメントの検索方法

著者(author)に『鈴木』を含むドキュメントの検索をする場合

String searchText = "鈴木";

SearchResponse<Book> response = esClient.search(s -> s
        .index("books")
        .query(q -> q
            .match(t -> t
                .field("author")
                .query(searchText)
            )
        ),
    Book.class
);

ここではmatchクエリーを使っていますが、Elasticsearchは多様なクエリの方法が存在します。検索結果をBookクラスで受け取るように指定しているため、response.hits().hits()には検索にヒットしたドキュメントが、Bookクラスのオブジェクトのイテラブルとして入っています。

まとめ

今回はElasticsearch Java API Clientで行う基本的な操作方法の一部を紹介しました。Elasticsearchの機能はまだまだ多く有り私自身も勉強中ですが、次回以降のブログで機会がありましたら、また紹介していこうと思います。

最後まで読んで頂きありがとうございました。

(土屋)