Docker 入門
Elasticsearch で全文検索を実行する(Windows PowerShell 7 版)
Elasticsearch とは何か,どのような特徴があるのか,などについては macOS 版のページに掲載しています.インストール等の作業を始める前に,まずは macOS 版を参照してください.
Elasticsearch のインストール
ここでは Windows 上で Elasticsearch を利用するための手順を説明します.ただし,PowerShell のバージョン 7 を前提として作業することにします.PowerShellのバージョン確認方法や 7x のインストール方法はこちらを参照してください.また,コマンドプロンプトでも概ね作業は可能だとは思われますが,様々な制約があることからやはり PowerShell 7 の利用を推奨します.
各種ファイルの準備
Windows に Elasticsearch をインストールする方法は様々あるようです.その中でも Docker を利用することで環境の構築が簡単になり,何度もやり直すこともできることから,ここでは Docker を用いる方法を説明します.
まず,任意のディレクトリ(フォルダ)を作成し,PowerShell 7 でそのディレクトリに移動します.その上で次のとおり5個のファイルとサブディレクトリを作成し,サブディレクトリ内にも1個のファイルを作成します.
PS C:\...\elastic202511> tree /f ⏎
フォルダー パスの一覧: ボリューム Windows
ボリューム シリアル番号は 3A55-753D です
C:.
│ .env
│ .env.example
│ .gitignore
│ docker-compose.yml
│ readme.md
│
└─elasticsearch
Dockerfile
PS C:\...\elastic202511>
プロジェクトの設計図となる docker-compose.yml には次のような内容を記載します.この内容は macOS 版で利用した docker-compose.yml から最低限必要な部分のみを抽出した内容です.なお,macOS 版の説明でも Kibana は利用しなかったため,Kibana に関連する項目はとりあえず削除しています.
docker-compose.yml
services:
elasticsearch:
build:
context: ./elasticsearch
args:
ES_VERSION: ${ES_LOCAL_VERSION} # バージョンを .env から渡す
container_name: ${ES_LOCAL_CONTAINER_NAME}
volumes:
- dev-elasticsearch:/usr/share/elasticsearch/data
ports:
- 127.0.0.1:${ES_LOCAL_PORT}:9200
environment:
- discovery.type=single-node
- ELASTIC_PASSWORD=${ES_LOCAL_PASSWORD}
- xpack.security.enabled=true
- xpack.security.http.ssl.enabled=false
- xpack.license.self_generated.type=trial
- xpack.ml.use_auto_machine_memory_percent=true
- ES_JAVA_OPTS=${ES_LOCAL_JAVA_OPTS}
- cluster.routing.allocation.disk.watermark.low=${ES_LOCAL_DISK_SPACE_REQUIRED}
- cluster.routing.allocation.disk.watermark.high=${ES_LOCAL_DISK_SPACE_REQUIRED}
- cluster.routing.allocation.disk.watermark.flood_stage=${ES_LOCAL_DISK_SPACE_REQUIRED}
- "_JAVA_OPTIONS=-XX:UseSVE=0"
ulimits:
memlock:
soft: -1
hard: -1
healthcheck:
test:
[
"CMD-SHELL",
"curl --output /dev/null --silent --head --fail -u elastic:${ES_LOCAL_PASSWORD} http://elasticsearch:9200",
]
interval: 10s
timeout: 10s
retries: 30
volumes:
dev-elasticsearch:
次に,elasticsearch/Dockerfile の内容を示します.これは Elasticsearch で日本語が含まれるドキュメントも検索できるようにするために,Elasticsearch の公式イメージに kuromoji をインストールした Docker イメージを作成する内容です.なお,Kuromoji は Java で開発されたオープンソースの日本語形態素解析器です.文章を単語に分割し,品詞のタグ付け,見出し化,漢字の読み方を取得するなどの機能があります.
elasticsearch/Dockerfile
ARG ES_VERSION=9.2.1
FROM docker.elastic.co/elasticsearch/elasticsearch:${ES_VERSION}
# analysis-kuromoji プラグインのインストール
RUN elasticsearch-plugin install --batch analysis-kuromoji
.env.example には利用する Elastisearch のバージョンや各種設定と共に,パスワードのプレースホルダーとなる情報を記載しておきます.このファイルは .env のサンプルとして Git のリポジトリに含めることを想定しています.
.env.example
# Copy this file to .env and replace placeholder values with actual secrets.
START_LOCAL_VERSION=0.12.0
ES_LOCAL_VERSION=9.2.1
# ES_LOCAL_VERSION=9.2.1-arm64
ES_LOCAL_CONTAINER_NAME=es-local-dev
ES_LOCAL_PASSWORD=your_password_here
ES_LOCAL_PORT=9200
ES_LOCAL_URL=http://localhost:${ES_LOCAL_PORT}
ES_LOCAL_DISK_SPACE_REQUIRED=1gb
ES_LOCAL_JAVA_OPTS="-Xms128m -Xmx2g"
ES_LOCAL_API_KEY=your_api_key_here
上の .env.example をコピーして次の .env を作成します.その後,パスワード ES_LOCAL_PASSWORD を事前に記入しておきます.このパスワードは次のステップで Docker イメージをビルドする際に利用されます.一方で,API キーとなる ES_LOCAL_API_KEY はビルド時に設定されないため,現時点ではプレースホルダーをそのまま残しておいて良いでしょう.
.env
# Copy this file to .env and replace placeholder values with actual secrets.
START_LOCAL_VERSION=0.12.0
ES_LOCAL_VERSION=9.2.1
ES_LOCAL_CONTAINER_NAME=es-local-dev
ES_LOCAL_PASSWORD=rs8O0QpW
ES_LOCAL_PORT=9200
ES_LOCAL_URL=http://localhost:${ES_LOCAL_PORT}
ES_LOCAL_DISK_SPACE_REQUIRED=1gb
ES_LOCAL_JAVA_OPTS="-Xms128m -Xmx2g"
ES_LOCAL_API_KEY=your_api_key_here
いま作成した .env にはパスワードや API キーといった機密情報が平文で記録されます.したがって,このファイルが Git のリポジトリに含まれないようにするため .gitignore を次のとおり作成しておきます.
.gitignore
.env
なお,readme.md には Git リポジトリに関する説明を記載します.リポジトリを GitHub にアップロードするとこのマークダウンファイルがプレビューされた形式で表示されます.
readme.md
# Elasticsearch
## PowerShell 7 での利用
- ElasticSearch をインストールして「小倉百人一首」の全文検索ができるようになるまでの手順を説明しています.
- [https://rinsaka.com/docker/711.html](https://rinsaka.com/docker/711.html)
```
______ _ _ _
| ____| | | | (_)
| |__ | | __ _ ___| |_ _ ___
| __| | |/ _` / __| __| |/ __|
| |____| | (_| \__ \ |_| | (__
|______|_|\__,_|___/\__|_|\___|
```
Docker イメージのビルド
docker-compose.yml をはじめ各種ファイルの準備ができたので,Docker イメージをビルドし,コンテナを起動します.なお,イメージのビルドは docker-compose.yml ファイルの内容に従って行われます.このとき,.env ファイルからパスワードが読み込まれて設定されることに注意してください.
PS C:\...\elastic202511> docker compose up -d --build ⏎
[+] Running 0/0
- Service elasticsearch Building 35.0s
[+] Running 0/1.0s (3/5) docker:desktop-linux
[+] Building 36.2s (3/5) docker:desktop-linux
[+] Building 37.2s (4/5) docker:desktop-linux
[+] Running 0/1idDefaultArgInFrom: Default value for ARG docker.elastic.co/elasticsearch/elasticsearch:${ES_VERSI 0.0s
[+] Building 40.7s (7/7) FINISHED docker:desktop-linux
=> [elasticsearch internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 237B 0.0s
=> WARN: InvalidDefaultArgInFrom: Default value for ARG docker.elastic.co/elasticsearch/elasticsearch:${ES_VERSI 0.0s
=> [elasticsearch internal] load metadata for docker.elastic.co/elasticsearch/elasticsearch:9.2.1 2.8s
=> [elasticsearch internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [elasticsearch 1/2] FROM docker.elastic.co/elasticsearch/elasticsearch:9.2.1@sha256:43ea348fb0ae21f8610b1d14 33.4s
=> => resolve docker.elastic.co/elasticsearch/elasticsearch:9.2.1@sha256:43ea348fb0ae21f8610b1d144dfd165ee404553 0.0s
=> => sha256:e95be542f6ccd0e2f6bde8b71354c5d4ef48a255e487d62e045a5f40509be37f 12.02kB / 12.02kB 0.0s
=> => sha256:c6433dd149922da27e5f63059096df0b9973aa14a9f0ed326cd7f56ec3614251 39.91MB / 39.91MB 2.9s
=> => sha256:43ea348fb0ae21f8610b1d144dfd165ee4045537bcdba3789ad0e5107533415c 685B / 685B 0.0s
=> => sha256:f7527485fb7219be12584b59026daed5b233eeb148da290f01c7fa09c20b0bbb 1.89kB / 1.89kB 0.0s
=> => sha256:8d211b2a612b3ef1927bd603a4e708a508b91fcb5d17f5d58b90ea3718622439 4.53MB / 4.53MB 2.0s
=> => sha256:19422d75c91fd6f23f60c4b6c455e3389cb37b254cced6e2b0157affe3c858c4 1.66kB / 1.66kB 0.9s
=> => sha256:5b9b4fdb0f0eb9ca9157c3b339e95460953f56c66554f815405414d4932660f9 9.76kB / 9.76kB 1.3s
=> => sha256:4ca545ee6d5db5c1170386eeb39b2ffe3bd46e5d4a73a9acbebc805f19607eb3 42B / 42B 1.6s
=> => sha256:2a5f7a7a340259eecd952ad1d8362d2ff6c03072e785bc71f67c0426cb25e133 717.14MB / 717.14MB 27.8s
=> => sha256:33eb280b14aa4f0e00fde64b62c334a7f50860960f1fb217f0b586d1a9df90f2 304B / 304B 2.3s
=> => sha256:2c5658d4132b878181abac1b5361cf5690c15447f05261bf6d1377372904fec4 1.76kB / 1.76kB 2.7s
=> => sha256:e1ae01d33a147981aa81c1178e0e303b46b5930a693ee94deaa4750838d65938 79.26kB / 79.26kB 3.1s
=> => extracting sha256:c6433dd149922da27e5f63059096df0b9973aa14a9f0ed326cd7f56ec3614251 0.8s
=> => sha256:a1572e149bc2379d560a51a97767a42ecd3a7512c05e787f41b9102513743feb 1.89kB / 1.89kB 3.3s
=> => extracting sha256:8d211b2a612b3ef1927bd603a4e708a508b91fcb5d17f5d58b90ea3718622439 0.1s
=> => extracting sha256:19422d75c91fd6f23f60c4b6c455e3389cb37b254cced6e2b0157affe3c858c4 0.0s
=> => extracting sha256:5b9b4fdb0f0eb9ca9157c3b339e95460953f56c66554f815405414d4932660f9 0.0s
=> => extracting sha256:4ca545ee6d5db5c1170386eeb39b2ffe3bd46e5d4a73a9acbebc805f19607eb3 0.0s
=> => extracting sha256:2a5f7a7a340259eecd952ad1d8362d2ff6c03072e785bc71f67c0426cb25e133 5.2s
=> => extracting sha256:33eb280b14aa4f0e00fde64b62c334a7f50860960f1fb217f0b586d1a9df90f2 0.0s
=> => extracting sha256:2c5658d4132b878181abac1b5361cf5690c15447f05261bf6d1377372904fec4 0.0s
=> => extracting sha256:e1ae01d33a147981aa81c1178e0e303b46b5930a693ee94deaa4750838d65938 0.0s
=> => extracting sha256:a1572e149bc2379d560a51a97767a42ecd3a7512c05e787f41b9102513743feb 0.0s
=> [elasticsearch 2/2] RUN elasticsearch-plugin install --batch analysis-kuromoji 4.4s
=> [elasticsearch] exporting to image 0.1s
=> => exporting layers 0.0s
=> => writing image sha256:03af6eb0244579605959d211326a96e7d8a3945b951e7348cfa571efaaa221e9 0.0s
[+] Running 4/4o docker.io/library/elastic202511-elasticsearch 0.0s
✔ Service elasticsearch Built 40.9s
✔ Network elastic202511_default Created 0.0s
✔ Volume "elastic202511_dev-elasticsearch" Created 0.0s
✔ Container es-local-dev Started 0.3s
PS C:\...\elastic202511>
ビルドが成功したので Docker イメージを一覧表示します.
PS C:\...\elastic202511> docker image ls ⏎
REPOSITORY TAG IMAGE ID CREATED SIZE
elastic202511-elasticsearch latest 03af6eb02445 21 seconds ago 1.45GB
PS C:\...\elastic202511>
コンテナも起動していることを確認します.
PS C:\...\elastic202511> docker container ls ⏎
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
64a6250ff75e elastic202511-elasticsearch "/bin/tini -- /usr/l…" 27 seconds ago Up 26 seconds (healthy) 127.0.0.1:9200->9200/tcp, 9300/tcp es-local-dev
PS C:\...\elastic202511>
それでは,Elasticsearch の API エンドポイントにリクエストを送信するコマンドを示します.接続の際にはユーザ名とパスワードの組合せか API キーが必要です.まず,ユーザ名 (elastic) とパスワード (rs8O0QpW) を指定してリクエストを送信するコマンドは次の形式です.ここで -u オプションの後ろに ユーザ名:パスワード の形式で指定します.もちろん,パスワードは実際に設定されたパスワードに変更してください.
curl -u elastic:>rs8O0QpW "http://localhost:9200/"
実際にユーザ名とパスワードと使ってリクエストを送信し,次のような結果が得られたら成功です.
PS C:\...\elastic202511> curl -u elastic:rs8O0QpW "http://localhost:9200/" ⏎
{
"name" : "64a6250ff75e",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "eV0E_uSCRPSQH0_NXae1hA",
"version" : {
"number" : "9.2.1",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "4ad0ef0e98a2e72fafbd79a19fa5cae2f026117d",
"build_date" : "2025-11-06T22:07:39.673130621Z",
"build_snapshot" : false,
"lucene_version" : "10.3.1",
"minimum_wire_compatibility_version" : "8.19.0",
"minimum_index_compatibility_version" : "8.0.0"
},
"tagline" : "You Know, for Search"
}
PS C:\...\elastic202511>
なお,Webブラウザで http://localhost:9200/ にアクセスする方法もあります.
同じユーザー名とパスワードでログインすると次のような結果が表示されます.
API キーの発行
Elasticsearch の管理者パスワードは .env ファイルに記載しておれば,コンテナにそのパスワードが登録される仕組みになっていました.しかしながら,API キーをあらかじめ設定することはセキュリティ上も好ましくありません.ここでは,管理者のパスワードを使って API キーを発行します.
すでに上で試したとおりですが,次のコマンドを使って接続できることを確認しておきます.
PS C:\...\elastic202511> curl -u elastic:rs8O0QpW "http://localhost:9200/" ⏎
{
"name" : "64a6250ff75e",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "eV0E_uSCRPSQH0_NXae1hA",
"version" : {
"number" : "9.2.1",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "4ad0ef0e98a2e72fafbd79a19fa5cae2f026117d",
"build_date" : "2025-11-06T22:07:39.673130621Z",
"build_snapshot" : false,
"lucene_version" : "10.3.1",
"minimum_wire_compatibility_version" : "8.19.0",
"minimum_index_compatibility_version" : "8.0.0"
},
"tagline" : "You Know, for Search"
}
PS C:\...\elastic202511>
API キーを発行するためのコマンドは次のような感じになります.ここで,パスワードは .env ファイル に記載された ES_LOCAL_PASSWORD の値を指定してください.また,name: の 「my-elastic-key」には任意に適当な名前を付けてください.その他の項目は API キーを用いて利用できる権限を細かく設定しています.例えば「"cluster": ["monitor"]」はクラスタの状態を確認するための権限です.インデックスについては「"names": ["*"]」であることからすべてのインデックスについてそれ以降の権限が付与されます.「"create_index"」「"delete_index"」「"read"」「"write"」の権限を与えることでいわゆる CRUD (Create, Read, Update, Delete) が可能になります.「"view_index_metadata"」によってマッピングの状態を確認できるようになります.「"monitor"」はインデックスの状態確認,「"manage"」はレプリカ数を変更するための権限です.おおよそ次の設定にしておけば,この先利用する作業はすべて実行できるはずです.
curl -u elastic:rs8O0QpW -H "Content-Type: application/json" -X POST "http://localhost:9200/_security/api_key" -d '{ "name": "my-elastic-key", "role_descriptors": { "my_role": { "cluster": ["monitor"], "index": [ { "names": ["*"], "privileges": [ "create_index", "delete_index", "read", "write", "view_index_metadata", "monitor", "manage" ] } ] } } }'
実際に上のコマンドを実行します.このとき,下のコマンドには改行後に >> が表示されているので,コピーペーストする際は上のコマンドを利用してください.コマンドが成功すれば「encoded」の後に表示された文字列が発行された API キーです.
PS C:\...\elastic202511> curl -u elastic:rs8O0QpW -H "Content-Type: application/json" -X POST "http://localhost:9200/_security/api_key" -d '{ >> "name": "my-mac-key", >> "role_descriptors": { >> "my_role": { >> "cluster": ["monitor"], >> "index": [ >> { "names": ["*"], "privileges": ["read","write","create_index"] } >> ] >> } >> } >> }' ⏎ {"id":"rh0bzpoBIADfu4bVVs2u","name":"my-mac-key","api_key":"D_1CjcKgw_Y5sIrGNlHU4w","encoded":"NlZGY3pwb0IyT1FPR1RNREtrRlc6WG1VUmZnVnYxSmYyMlpFMDQwTHJ6UQ=="} PS C:\...\elastic202511>
新たに生成した API キーを利用して接続できたら成功です.このとき -H オプションを利用していることに注意してください.
curl -H "Authorization: ApiKey NlZGY3pwb0IyT1FPR1RNREtrRlc6WG1VUmZnVnYxSmYyMlpFMDQwTHJ6UQ==" "http://localhost:9200/"
PS C:\...\elastic202511> curl -H "Authorization: ApiKey NlZGY3pwb0IyT1FPR1RNREtrRlc6WG1VUmZnVnYxSmYyMlpFMDQwTHJ6UQ==" "http://localhost:9200/" ⏎
{
"name" : "64a6250ff75e",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "eV0E_uSCRPSQH0_NXae1hA",
"version" : {
"number" : "9.2.1",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "4ad0ef0e98a2e72fafbd79a19fa5cae2f026117d",
"build_date" : "2025-11-06T22:07:39.673130621Z",
"build_snapshot" : false,
"lucene_version" : "10.3.1",
"minimum_wire_compatibility_version" : "8.19.0",
"minimum_index_compatibility_version" : "8.0.0"
},
"tagline" : "You Know, for Search"
}
PS C:\...\elastic202511>
API キーの生成ができたら,.env ファイルに記載しておきます.
.env
# Copy this file to .env and replace placeholder values with actual secrets.
START_LOCAL_VERSION=0.12.0
ES_LOCAL_VERSION=9.2.1
ES_LOCAL_CONTAINER_NAME=es-local-dev
ES_LOCAL_PASSWORD=rs8O0QpW
ES_LOCAL_PORT=9200
ES_LOCAL_URL=http://localhost:${ES_LOCAL_PORT}
ES_LOCAL_DISK_SPACE_REQUIRED=1gb
ES_LOCAL_JAVA_OPTS="-Xms128m -Xmx2g"
ES_LOCAL_API_KEY=NlZGY3pwb0IyT1FPR1RNREtrRlc6WG1VUmZnVnYxSmYyMlpFMDQwTHJ6UQ==

