🐟

きょうぼくは、Elasticsearchの中身をのぞいてしまった…。

に公開

この記事はポート株式会社 サービス開発部 Advent Calendar 2025の8日目の記事です。

はじめに

はじめまして!ポート株式会社でバックエンドエンジニアとして働いているCookieGarden(渡邉)と申します!

普段は就活会議のサービス開発を担当しています。この記事では、就活会議で一部使用されているElasticsearchの中身を皆さんと一緒に覗いてみようと思います

覗くといってもさらっと触れてみようぐらいのイメージですので気軽に読んでいただければと思います!これをきっかけに公式のドキュメントなど色々な方法で学習するきっかけになれば幸いです!

こんな人に読んでほしい!

  • 独学でCRUDアプリは作れるようになったが「何か物足りないな、、」と思っているそこのアナタ!
  • 検索機能を作ったが「なんかイマイチだな、、」と思っているそこのアナタ!
  • 名前は知っていて興味はあるがなかなか踏み出せずにいるそこのアナタ!

Elasticsearchとは?

就活会議にJoinして色々キャッチアップしている際に「Elasticsearchってなんですか?」とメンターの先輩エンジニアに聞いたときに「んー。検索をイイ感じにしてくれるやつだね」と教わりました。調べてみましょう
https://www.elastic.co/jp/elasticsearch

Elasticsearchは、スピード、スケール、AIアプリケーション向けに構築されたオープンソースの分散型検索および分析エンジンです。検索プラットフォームとして、構造化データ、非構造化データ、ベクトルデータをリアルタイムで保存し、高速なハイブリッド検索とベクトル検索を提供し、オブザーバビリティとセキュリティ分析を強化し、高いパフォーマンス、精度、関連性を備えたAI主導のアプリケーションを実現します。

とにかくイイ感じにしてくれそうではありますね、一言で言うと検索エンジンです。

RDB(SQL)と違うところ

色々調べていくと「検索に特化したDB」みたいなイメージを持ち始めると思います

  • 構造はRDBに似ている
  • 検索は爆速だが、JOINはできないから工夫する必要がある

専門用語は「SQL」に置き換えて理解してみよう

Elasticsearchを勉強し始めると、「インデックス」「ドキュメント」「クラスタ」 といったちょっと聞いたことがある用語が次々と出て来ると思います、聞いたことあるならいいじゃないかって?これが問題なんです!
Elasticsearchの専門用語を知ったかぶりして「ここでindexを貼るんですか?」とか言ってました。皆さんにはこうなってほしくありません、、他にも解説している記事はありますが、以下のように置き換えると良いです

Elasticsearch SQL (RDB) で言うと?
マッピング(Mapping) スキーマ(Schema)
インデックス(Index) テーブル(Table)
ドキュメント(Document) レコード(Row/行)
フィールド(Field) カラム(Column)

自分はIndexTable なことが一番違和感を感じました、「RDBでインデックス(索引)と言えば検索を速くするための目次のような機能ですよね。でもElasticsearchではインデックス自体がデータを入れる箱(テーブル)を指すんです。ここに私は騙されました(誰も騙してない)

早速アプリケーションに組み込んでみよう!

今回はあくまでも覗くだけなので細かい環境構築やセットアップは省きます。ここでは組み込むためにやることは大きく分けて

  1. マッピング定義
  2. データの保存
  3. 検索クエリの作成

の3つです!順番に見ていきましょう!

マッピング定義

マッピングとは、RDBでいうところのスキーマ(Schema)定義です。

Elasticsearchのインデックス(テーブル)に、どのようなデータ(フィールド=カラム)を、どのような形式(型)で保存するかをあらかじめ定義します。

この定義が、「イイ感じの検索」を実現するための最初のステップです。

また、RDBでは、文字列型 (VARCHAR や TEXT) で保存すればOKなことが多いですが、Elasticsearchでは、そのフィールドを「どう検索したいか」によって型を定義します。

keyword 型: 完全に一致するかどうかをチェックする検索(例:IDや製品コードなど)に使います。

text 型: 文章全体を分析し、表記ゆれなども考慮した「イイ感じの検索」(例:商品の説明文やブログ記事の内容など)に使います。

PUT article
{
  "mappings": {
    "properties": {
      "id": {
        "type": "integer"
      },
      "title": {
        "type": "text"
      },
      "body": {
        "type": "text"
      },
      "author": {
        "type": "keyword"
      },
      "created_at": {
        "type": "date"
      }
    }
  }
}

データの保存

先ほど、ElasticsearchとRDBは何が違うの?と紛らわしい表現をしましたがアプリケーションに組み込む時は「RDBのレコード」と「Elasticsearchのドキュメント」の作成をセットで行うと思って下さい!置き換えるわけではなくあくまでも「検索用のコピー」を作るイメージが正しいです!

POST article/_doc

{
  "id": 12345,
  "title": "きょうぼくは、Elasticsearchの中身をのぞいてしまった…。",
  "author": "CookieGarden",
  "body": "はじめまして!ポート株式会社で〜",
  "created_at": "2025-12-08T00:00:00Z"
}

検索

Elasticsearchの検索は、RDBのSQLとは異なり、DSL (Domain Specific Language) と呼ばれるJSON形式のクエリを使って行います。このJSONクエリを特定のAPIエンドポイントに送信することで、「イイ感じの検索」が実現します。

先ほどマッピングしたフィールドを使って、2つの主要な検索タイプを見ていきましょう。

GET article/_search
{
  "query": {
    "term": {
      "author": "CookieGarden" 
    }
  }
}

これは特定の著者が書いた記事だけを検索しようとしてますね!term クエリを使うと完全一致検索を行うことができます

GET article/_search
{
  "query": {
    "match": {
      "body": "Elasticsearch"
    }
  }
}

こっちはmatch クエリを使用してElasticsearchに関する記事を探しているみたいですね!この方法は完全一致ではなく本文にElasticsearchが入っている記事を関連度順に返してくれます、これが「検索をイイ感じにしてくれる」の正体です!

このようにJSONクエリ一つで実現できるのがElasticsearchの強力な点です。他にも単にデータを探すだけでなく、検索クエリとドキュメントの関連度をスコアリングし、最も関連性の高いものを上位に表示できたりもするので興味がある方は調べてみて下さい!

まとめ

  • Elasticsearchとは検索をイイ感じにしてくれる検索エンジン
  • あらかじめマッピングをしておく
  • データ保存はあくまでもDB、インデックスはついで
  • 「keyword」と「text」を使い分けるのが検索体験向上のカギ

最後に

覗いてみましょう!と言いましたがいかがでしたでしょうか。最低限の機能だけではなくよりよくしようと思うことはユーザー体験を作れるエンジニアになるための大きな一歩だと思っています、お互い頑張りましょう笑 この記事が学習への足掛かりになれたのなら幸いです!読んでいただきありがとうございました!

ポート株式会社 エンジニアブログ

Discussion