OpenSearch 構築、基本操作

久々に OpenSearch を使用する機会があり、いろいろ忘れていたのでメモがてら書いていきます。

目次

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 を作成します。
OpenSearchOpenSearch ダッシュボードを用意します。
ダッシュボードは、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:5601OpenSearch ダッシュボードにアクセスします。※ 30秒程度かかることがあります。

OpenSearch ダッシュボード起動画面

以下の情報でログインします。

Username:admin  
Password:admin

ログインできました。

OpenSearch ホーム画面

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

OpenSearch メニュー

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

DevTools

基本用語

OpenSearch は、RDB(リレーショナルデータベース)と概念的に近い部分があります。

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

基本操作

実際に、OpenSearch ダッシュボードから操作してみます。

インデックス作成

documents という名前のインデックスを作成します。

PUT documents

インデックス作成

ドキュメント登録

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

ドキュメント登録

ドキュメント検索

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

本文を検索

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

おわりに

OpenSearch の構築と、基本的な操作をやってみました。
もう少し複雑な検索を行えるようにするための、インデックスのマッピング定義や、アナライザーの設定などについても書きたいと思ってます。