OpenSearchとは #
OpenSearch は Elasticsearch をベースに作られた全文検索エンジンです。
Apache License 2.0 ライセンスで公開されており、速度や分析柔軟性に優れた検索機能を利用できます。
事前に登録しておいた json ファイルの中身をフルテキスト検索するイメージです。
※ 本記事では Elasticsearch との違いには特に触れません。
構築 #
docker compose で構築していきます。
まず、Dockerfile を作成します。
詳しい解説は割愛しますが、日本語を扱う上で便利なプラグインを入れています。
FROM opensearchproject/opensearch:1.1.0
RUN /usr/share/opensearch/bin/opensearch-plugin install analysis-kuromoji
RUN /usr/share/opensearch/bin/opensearch-plugin install analysis-icu
次に、compose.yaml を作成します。
OpenSearch と OpenSearch ダッシュボードを用意します。
ダッシュボードは、GUI から OpenSearch の操作やデータの閲覧などいろいろできます。
services:
opensearch-dashboards:
image: opensearchproject/opensearch-dashboards:1.0.1
container_name: opensearch-dashboards
environment:
OPENSEARCH_HOSTS: "https://opensearch:9200"
ports:
- 5601:5601
links:
- opensearch
opensearch:
build:
context: .
dockerfile: Dockerfile
container_name: opensearch
environment:
- cluster.name=docker-cluster
- node.name=os-node
- cluster.initial_master_nodes=os-node
- bootstrap.memory_lock=true
- http.host=0.0.0.0
- transport.host=127.0.0.1
- "OPENSEARCH_JAVA_OPTS=-Xms1g -Xmx1g"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- $PWD/.local/opensearch:/usr/share/opensearch/data
ports:
- 9200:9200
起動します。
docker compose up -d
起動が完了したら、http://localhost:5601 の OpenSearch ダッシュボードにアクセスします。※ 30秒程度かかることがあります。

以下の情報でログインします。
Username:admin
Password:admin
ログインできました。

左のメニューから Dev Tools
を開きます。

Dev Tools では、API で OpenSearch を操作できます。ここまできたら構築完了です。

基本用語 #
OpenSearch は、RDB(リレーショナルデータベース)と概念的に近い部分があります。
- インデックス(index)
- RDB のテーブルのようなものです。
- ドキュメント(document)
- RDB のレコードのようなものです。
- 具体的には、1つの json データです。
- マッピング(mapping)
- RDB のテーブルスキーマのようなものです。
- インデックスのデータ構造を定義したものです。
- インデックス作成時にあらかじめ定義することができますが、定義していない状態でドキュメントを登録すると自動で作成されます。
- 解析関連
- アナライザー(analyzer)
- テキストに対して言語解析するもの。
- キャラクターフィルター、トークナイザー、トークンフィルターなどから構成される。
- キャラクターフィルター(charfilter)
- 文字単位に適用する処理を定義したもの。削除、追加、変更など。
- トークナイザー(tokenizer)
- テキストをトークンに分割する。日本語の文章を品詞ごとに分割するなど。
- トークンフィルター(tokenfilter)
- 分割されたトークンに適用される処理を定義したもの。助詞は除去するなど。
- アナライザー(analyzer)
基本操作 #
実際に、OpenSearch ダッシュボードから操作してみます。
インデックス作成 #
documents という名前のインデックスを作成します。
PUT documents

ドキュメント登録 #
POST /documents/_doc
{
"title": "ドキュメントタイトル",
"content": "ドキュメントの中身です。"
}

ドキュメント検索 #
GET /documents/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"content": "ドキュメント"
}
}
]
}
},
"highlight": {
"fields": {
"content": {}
}
}
}

検索時に highlight
を設定すると、検索したフィールドのテキストのうちどこかヒットしたのかを em タグで囲んで返してくれます。
google などで検索したときも、検索したワードが太字になっていたりしますよね。OpenSearch 側でタグで囲んでくれるので同じような表示を簡単に実現できます。