初心者でもわかる!Pythonで始めるElasticsearch入門

本記事では、全文検索エンジン「Elasticsearch(以下 ES)」を Python から使い始めるための基礎を、初心者向けにやさしく解説します。

  • 対象読者:Python に慣れ始めた初心者
  • 前提知識:Python の基本的な文法、pip によるパッケージインストール
  • 到達目標
    1. Elasticsearch 環境の構築
    2. Python クライアント elasticsearch-py の利用
    3. データの登録(インデックス)、検索、更新、削除
    4. 実践的な演習問題で学んだ知識を定着

Elasticsearch とは?

Elasticsearch は、分散型の RESTful な全文検索エンジンです。

  • Lucene をベースに開発
  • ドキュメント指向で JSON を扱う
  • 水平スケーリングや高可用性が特徴
主な用途
  • Web サイトの検索機能
  • ログデータの可視化・分析
  • ビッグデータのリアルタイム処理

環境構築

Elasticsearch のインストール

はじめに、公式サイトからダウンロードします。

解凍後、bin/elasticsearch を実行します。

ブラウザで http://localhost:9200/ にアクセスし、以下が返れば正常起動です。

{
  "name" : "node-1",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "...",
  "version" : {
    "number" : "8.x.x",
    ...
  },
  "tagline" : "You Know, for Search"
}

Python クライアントのインストール

pip install elasticsearch

Python からの基本操作

以下、Python スクリプト例を交えながら説明します。

from elasticsearch import Elasticsearch

# クライアントを生成
es = Elasticsearch("http://localhost:9200")

インデックスの作成

index_name = "books"
mapping = {
    "mappings": {
        "properties": {
            "title":   {"type": "text"},
            "author":  {"type": "keyword"},
            "content": {"type": "text"},
            "year":    {"type": "integer"}
        }
    }
}
es.indices.create(index=index_name, body=mapping)

ドキュメントの登録(Index API)

doc = {
    "title": "Python入門",
    "author": "山田太郎",
    "content": "Pythonの基本文法を学ぶ...",
    "year": 2025
}
res = es.index(index="books", id=1, body=doc)
print(res["result"])  # created

ドキュメントの取得(Get API)

res = es.get(index="books", id=1)
print(res["_source"])

検索(Search API)

query = {
    "query": {
        "match": {"content": "基本文法"}
    }
}
res = es.search(index="books", body=query)
for hit in res["hits"]["hits"]:
    print(f'ID={hit["_id"]}, score={hit["_score"]}')

更新(Update API)

update_body = {
    "doc": {"year": 2026}
}
es.update(index="books", id=1, body=update_body)

削除(Delete API & Index 削除)

es.delete(index="books", id=1)
es.indices.delete(index="books")

応用テクニック

  1. バルク登録(Bulk API)
    大量データを一度に登録して高速化
  2. アナライザー設定
    日本語形態素解析プラグイン(kuromoji)導入で日本語検索を強化
  3. フェイルオーバー
    複数ノードをクラスタ構成にして高可用性を実現

演習問題

学んだ内容を確認するため、以下の演習に取り組んでみましょう。

問題1:インデックス作成

「movies」という名前で、以下プロパティを持つインデックスを作成してください。

  • title:text
  • director:keyword
  • year:integer
  • summary:text

問題2:複数ドキュメントの登録

問題1で作成した「movies」インデックスに、次の映画データをバルク登録してください。

  1. タイトル: 君の名は。, 監督: 新海誠, 年: 2016
  2. タイトル: 千と千尋の神隠し, 監督: 宮崎駿, 年: 2001

問題3:検索クエリ

「summary」フィールド内に「異世界」というワードを含むドキュメントを検索するクエリを作成し、実行結果を表示してください。

問題4:ドキュメント更新

IDが2のドキュメントの year を 2002 に更新するコードを書いてください。

問題5:インデックス削除

「movies」インデックスを削除するコードを書いてください。


解答例

解答1:インデックス作成
mapping = {
    "mappings": {
        "properties": {
            "title":   {"type": "text"},
            "director":{"type": "keyword"},
            "year":    {"type": "integer"},
            "summary": {"type": "text"}
        }
    }
}
es.indices.create(index="movies", body=mapping)
解答2:複数ドキュメントのバルク登録
from elasticsearch import helpers

docs = [
    {"_index": "movies", "_id": 1, "_source": {"title": "君の名は。", "director": "新海誠", "year": 2016}},
    {"_index": "movies", "_id": 2, "_source": {"title": "千と千尋の神隠し", "director": "宮崎駿", "year": 2001}}
]
helpers.bulk(es, docs)
解答3:検索クエリ
query = {
    "query": {
        "match": {"summary": "異世界"}
    }
}
res = es.search(index="movies", body=query)
for hit in res["hits"]["hits"]:
    print(hit["_source"])
解答4:ドキュメント更新
update_body = {"doc": {"year": 2002}}
es.update(index="movies", id=2, body=update_body)
解答5:インデックス削除
es.indices.delete(index="movies")

おわりに

本記事では、Python から Elasticsearch を使うための基礎を一通り解説しました。

  • 環境構築から CRUD 操作
  • バルク登録や応用プラグインの紹介
  • 演習問題で理解を深める

このチュートリアルをもとに、実際のアプリケーションやログ分析、検索機能の実装へと応用してみてください。Elasticsearch の奥深い機能に触れ、より高度な設定やチューニングにもぜひ挑戦してみましょう!