ElasticsearchをJavaAPIで触ってみた

こんにちは!SMOOSYの開発を担当している周です。
SMOOSYを利用している学会がどんどん増えてきたなかで、請求検索機能を使う時に検索のスピードが遅いという声が出ました。そこで、解決策の一つとして使えそうか検索エンジンElasticsearchをJavaAPIで触ってみました。

Elasticsearchとは

Elastic社により開発されたオープンソースの全文検索エンジンです。Apache Luceneをベースとしており、インデックスから目的の単語を含むドキュメントを高速に検索することが可能です。簡単に言えば、検索に特化したクエリを実行することができるデータベースのようなものです。NoSQLのDBといっても良いと思います。世界で多く企業の検索サイトに使われています。アトラスでもConfitで利用しています。

環境準備

今回は以下の環境でElasticsearchを利用してみます。

    • macOS 11.6
    • Elasticsearch 7.8.0
    • IntelliJ IDEA 2021.1.3
    • java 11

インストール

Elasticsearchをインストールするには、まずJavaの実行環境をインストールする必要があります。Javaの実行環境をインストールしていない方はこちらを参考にしてください。
Elasticsearchのダウンロードと解凍

Elasticsearchの実行

接続確認

上記のコマンドを実行し、下記のようなJSONのレスポンスが出たら、インストールは成功です。

要注意:Elasticsearchのバージョンアップによって、一部機能が使えなくなる場合があります。この記事の内容をやってみたい時、環境準備に記載しているバージョンをチェックした上で試してください。

さっそく始めましょう!

始める前に、Elasticsearchのインデックスとドキュメントとクエリを理解する必要があります。簡単に言うと、下記の表のような感じです。

対応関係表
Elasticsearch リレーショナルデータベース
インデックス データベース
ドキュメント レコード
クエリ SQL文

インデックスとドキュメントの概念は公式リファレンスの基本概念を参考にしてください。

pom.xml

pomファイルにライブラリ情報を下記のように記述してください。記述するとElasticsearchのClientが使えるようになります。

インデックス

インデックスはリレーショナルデータベースのデータベースのようなものです。これから、インデックスに関する作成、検索、削除の処理をやってみます。

インデックスを作成する

userというインデックスを作成します。

作成確認

レスポンス

レスポンスの結果により、 userというインデックスが作成されたことが分かります。

インデックスを検索する

先程追加したuserのインデックスを検索してみます。

consoleで出力した結果

出力結果がCURLコマンドでのレスポンス内容と同じなので、インデックス検索ができていることが分かります。

インデックスを削除する

作成したインデックスを削除したいときは、下記の書き方で削除することができます。

ドキュメント

ドキュメントはリレーショナルデータベースの行のようなものです。これから、ドキュメントの作成、検索、更新、削除に関する操作をやってみます。

ドキュメントを作成する

userのインデックスに「id=1001、name=”周001”、sex=”男”、age=”30”」というドキュメントを作成します。

作成確認

レスポンス

レスポンス結果から、”_id”: “1001”のドキュメントが作成されたことが分かります。

ドキュメントを検索する

先程作成したドキュメントをidで検索します。

出力結果

結果により、idを通じてインデックスからドキュメントを取得したことがわかります。

ドキュメントを更新する

作成した「id=1001」のドキュメントで「sex」を「男」から「女」に変更します。

作成確認

レスポンス

レスポンス結果より、「sex」が「男」から「女」に変更されたことが分かります。

ドキュメントを削除する

作成した「id=1001」のドキュメントを削除します。

出力結果

DeleteResponseのresultでdeletedを返却していることから、ドキュメントが削除されたことがわかります。

ドキュメントを複数作成する

ドキュメントはデータベースの行のように、一度に複数作成することもできます。

出力結果

作成された行数が10であるという結果により、ドキュメントが複数作成されたことがわかります。

クエリ

クエリはリレーショナルデータベースのSQL文のようなものです。これから、全てを検索、条件検索、ページング検索、あいまい検索、グルーピング検索の五つを例として、クエリを実行してみます。

全てを検索

SQLでの「SELECT * FROM USER」と同じです。userのインデックスから全てのドキュメントを検索します。

出力結果

ヒットした件数、検索にかかった時間、検索結果が出力されました。

条件検索

SQLでの「SELECT * FROM USER WHERE age = 30」と同じです。インデックスから「age=30」のドキュメントを検索します。

出力結果

年齢が30歳のレコードが出力されました。

ページング検索

SQLでの「SELECT * FROM USER limit 2 」と同じです。インデックスから取得したドキュメント件数の上限を設定して検索します。

出力結果

あいまい検索

SQLでの「SELECT * FROM USER WHERE name LIKE “周%”」と同じです。インデックスからドキュメントを検索します。

出力結果

”周002”のデータを検索できました。

グルーピング検索

SQLでの「SELECT age, COUNT(*) FROM USER GROUP BY age」と同じです。インデックスからドキュメントを検索します。

出力結果

最後に

以上でElasticsearchに関するインデックス、ドキュメント、クエリをJavaAPIを利用して操作する方法を簡単に紹介しました。Elasticsearchを触る時、いろいろ理解しないといけないことがありますが、リレーショナルデータベースと比較して、対応関係が理解できればそんなに複雑ではないかと思います。このようにアトラスでは、日々新しい技術にチャレンジしています。今後もより良いシステム開発のために、色々な技術を検証していきます!