【入門】Elasticsearch とは?わかりやすく解説

Elasticsearch

Elasticsearch とは、複数のファイルから特定の文字列を分散検索するソフトウェアです。

具体的には google 検索や、github のソースコード検索のような全文検索 (後述) が行えます。

なお、Elasticsearch に関連する記事は以下です。

  1. Elasticsearch とは (概要/できること/検索方法)
  2. マッピング管理とテンプレート
  3. Analyzer の設定 (日本語検索、トークナイズ)
  4. 集計・分類 (Aggregations)
  5. Dynamic index settings の変更
  6. データ構造
スポンサーリンク

全文検索とは

全文検索とは全文検索とは、複数のファイルから特定の文字列を検索することです。

全文検索には、主に以下の2つの手法があります。

grep 型

grep 型とはgrep 型とは、複数のファイルを上から順番に検索する方法です。
ファイルの数が増えると検索速度が大幅に低下する特徴があります。

UNIX の grep コマンドが、こちらに当たります。

索引 (インデックス) 型

索引 (インデックス) 型とは索引 (インデックス) 型とは、転置インデックス (ある単語を含むファイル一覧) を作成しておくことで、ファイルの検索速度を向上する方法です。

Elasticsearch の全文検索が、こちらに当たります。

インデックス型では、検索する単語を1行だけスキャンすれば良いので、高速に検索できます。
※ grep 型ではドキュメントをフルスキャンする必要があります

インデックス型の全文検索を利用した例は以下のとおりです。

全文検索の例説明
Elasticsearch の検索複数のファイル (ドキュメント) から一致する文字列を検索
Google 検索複数のファイル (Webページ) から一致する文字列を検索
GitHub のソースコード検索複数のファイル (ソースコード) から一致する文字列を検索
スポンサーリンク

Elasticsearch 用途/事例/できる事

Elasticsearch の主な利用用途は以下の2つです。

企業におけるドキュメント検索の利用例は以下のとおりです。

■ZOZOTOWN: 商品検索

GitHub: ソースコード検索

ソフトウェア開発の加速化
エンドユーザーと開発者の両方にとって強力な検索が可能に ApacheSolrからElasticsearchへの移行により、スケ ールアウトが可能になり急激に拡大するユーザーのニ ーズ対応に ほとんどのタイプのデータをインデックスして検索可 能に 開発者アプリケーションでプログラムによる高度な検 索が可能に 新し...

日経新聞: 記事の検索、アクセスログの解析

日本経済新聞社: ドキュメント総数1.6億件、国内最大級のデータベース事業の検索を担う
1876 年創刊の日本経済新聞をはじめとする新聞を中核に、出版や放送など幅広い事業を展開。 デジタル分野でも、2010 年に日本初の本格的有料電子版サービスとして創刊した「日経電子版」 や、1984 年にサービスを開始した「日経テレコン」など多くのサービスを手掛ける。 ...

異常検知

企業における異常検知の利用例は以下のとおりです。

■RICOH: セキュリティインシデントの検知

SOCにおけるリアル、CSIRT:株式会社リコーを実現”見える化、“タイムデータの活用を促進しすることでリコーグループのセキュリティを強化
1日2TBにおよぶITデバイスのログを35ノードのElasticsearchで瞬時に検索し、セキュリティ上の脅威をプロアクティブに排除...

Netflix: セキュリティログの監視

スポンサーリンク

Elastic Stack (ELK Stack) とは

Elastic Stack (ELK Stack) とは、以下の4つのソフトウェアのことです。

ソフトウェア説明
Elasticsearchファイル (ドキュメント) を保存・検索
KibanaElasticsearch 内のドキュメントを可視化する BI ツール
LogstashElasticsearch に送信するデータの形式を変換
Beatsサーバーから Elasticsearch や Logstash にデータを転送

Kibana については、公式で紹介されている以下の GIF 画像を見るのがわかりやすいです。

https://www.elastic.co/jp/what-is/kibana-reporting

Logstash や Beats の代わりに、Fluentd でデータを収集する構成も一般的です。

こちらの構成は EFK (Elasticsearch, Fluentd, Kibana) と呼ばれます。

Elasticsearch のアーキテクチャ

Elasticsearch では、データを以下のように持ちます。

インデックス

インデックスとは、ドキュメントの集合 (日/週/月ごとのログなど) です。

ドキュメント

ドキュメントとは、フィールドの集合 (1つのログなど) です。
JSON オブジェクトに相当します。

フィールド

フィールドとは、JSON オブジェクトの Key-Value (名前と値の組) に相当します。
各フィールドはデータ型 (text, number 等) を持ちます (一覧はこちら)。

マッピング

マッピングとは、フィールドの設定です。マッピングは1つのインデックスに1つです。

インデックスは、以下のように配置します。

クラスター

クラスターとは、ノードの集合 (≒複数のコンピュータ) です。

ノード

ノードとは、1つの Elasticsearch (≒1台のコンピュータ) のことです。

ノードには、主に次の4種類の属性が存在します。

ノードの種類役割
Master ノードクラスターのメタデータなどを管理するノード
・Master ノードはクラスターに1台のみ
・それ以外のノードは Master-eligible ノードと呼ぶ
・Master-eligible ノードが昇格すると Master ノードになる
Data ノードデータを格納・リクエストの処理(検索や集計など)するノード
Ingest ノードデータの変換や加工し、Data ノードに格納するノード
Logstash と同じ役割
Coordinating ノードリクエストを適切なシャードにルーティングするノード
・Data ノードでもリクエストはルーティング可能
・Data ノードにルーティング処理の負荷を掛けたくない場合に設定
1つのノードに複数の属性を割り当てることも可能

シャード

シャードとは、インデックスをノードごとに分割したものです。

Elasticsearch では、シャード単位で並列処理が可能です。

シャードには、以下の2種類が存在します。

用語説明
プライマリーシャード書き込み処理を行うシャード
レプリカシャードプライマリーシャードのコピー (レプリケーション)
検索処理の負荷分散や、データのバックアップとして利用

なお、インデックス、シャード、ドキュメントの関連は、以下のとおりです。

シャード (Elasticsearch shard) は、複数のドキュメントを持ちます。

https://thoughts.t37.net/designing-the-perfect-elasticsearch-cluster-the-almost-definitive-guide-e614eabc1a87 より。一部改変

Elasticsearch のインストール

ここからは、Docker を使った Elasticsearch のインストール方法を紹介します。

Docker を使わないインストール方法はこちら

ここでは Amazon Linux 2 でインストールする方法を紹介します。

その他の OS については以下のドキュメントをご覧ください。

Elasticsearch のインストール

Installing Elasticsearch | Elasticsearch Guide [8.12] | Elastic

Kibana のインストール

Kibanaのインストール | Kibanaユーザーガイド [5.4] | Elastic

Java のインストール

Elasticsearch を実行するには Java 8 が必要なので、まずは Java 8 をインストールします。

sudo yum install java-1.8.0-openjdk -y
sudo yum install java-1.8.0-openjdk-devel -y
java -version
openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-b09)
OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)

openjdk version "1.8****" 以上であれば OK です。

Elasticsearch のインストール

次に Elasticsearch をインストールします。

sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
sudo vim /etc/yum.repos.d/elasticsearch.repo
[elasticsearch]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=0
autorefresh=1
type=rpm-md
sudo yum install --enablerepo=elasticsearch elasticsearch -y
sudo systemctl start elasticsearch
curl localhost:9200
{
  "name" : "***",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "***",
  "version" : {
    "number" : "7.10.0",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "***",
    "build_date" : "2020-11-09T21:30:33.964949Z",
    "build_snapshot" : false,
    "lucene_version" : "8.7.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

Kibana のインストール

Kibana をインストールします。

sudo vim /etc/yum.repos.d/kibana.repo
[kibana-7.x]
name=Kibana repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
sudo yum install kibana -y
sudo vim /etc/kibana/kibana.yml
server.host: "0.0.0.0"
sudo systemctl start kibana

ブラウザから Kibana(localhost:5601) にアクセスします。

以下のページが表示されれば成功です。(この記事は Kibana バージョン 7.10.0です)

アクセスできない場合

Elastic Kibana v7.3.0でSystemctrlを用いた起動ができず再起動を繰り返す。 - szkhaven.com
自分的メモです。 v6.7を使用してたのですが、そろそろv7に上げよう 続きを読む

なお、docker については以下の記事をご覧ください。

docker コンテナを作成

version: '3'
services:
  elasticsearch:
    image: elasticsearch:7.12.1
    container_name: elasticsearch
    environment:
      - discovery.type=single-node
    ports:
      - 9200:9200
  kibana:
    image: kibana:7.12.1
    ports:
      - "5601:5601"
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200

これでシングルノードの Elasticsearch コンテナが立ち上がります。

Elasticsearch にアクセス

curl localhost:9200
{
  "name" : "123456789abc",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "1234567890abcdefghijkl",
  "version" : {
    "number" : "7.12.1",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "1234567891456789123456789",
    "build_date" : "2021-04-20T20:56:39.040728659Z",
    "build_snapshot" : false,
    "lucene_version" : "8.8.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

起動に成功している場合は、上記のような結果が返ってきます。

※ 「curl: (56) Recv failure: Connection reset by peer」が返ってくる場合は初期化処理が完了するまでお待ちください。

Kibana にアクセス

Kibana コンテナにアクセスするために、ブラウザで http://localhost:5601 を開きます。

Elasticsearch の使い方

Elasticsearch は以下のようなツールを使い、REST API で操作します。

なお、Kibana の Dev Tools は以下の手順で開けます。

Dev Tools の開き方(kibana 7.10.0 の場合)

今回は現時点で最新のメジャーバージョンである Elasticsearch 7.x の使い方を説明します。(Elsticsearch はメジャーバージョンが変化すると、後方互換性がなくなります。)

CRUD 操作 + Bulk API

ElasticsearchREST API では、ドキュメントに対して以下のような CRUD 操作が可能です。

REST API説明対応する CRUD
Index APIインデックスにドキュメントを追加Create
Get APIインデックスのドキュメントを取得Read
Update APIインデックスのドキュメントを更新Update
Delete APIインデックスのドキュメントを削除Delete

Index API (Create)

Index API とは、インデックスにドキュメントを追加する API です。

PUT /<インデックス名>/_doc/<ドキュメント ID>

で指定したインデックスにドキュメントを追加できます。

PUT /test/_doc/1
{
  "date":"2020/11/01 09:00 JST",
  "Tweet":"ツイッターをはじめました。",
  "User ID":"hoge"
}

右上の三角ボタンで実行します。

curl の場合

curl localhost:9200/test/_doc/1?pretty -XPUT -H "Content-Type: application/json" -d '
{
  "date":"2020/11/01 09:00 JST",
  "Tweet":"ツイッターをはじめました。",
  "User ID":"hoge"
}'

補足 データストリームへドキュメントを追加する場合

データストリームとは、複数のインデックスを1つにまとめたものです。

データストリームの詳細は以下のドキュメントに記載がございます。

Data streams | Elasticsearch Guide [8.12] | Elastic

データストリームにドキュメントを追加するためには、以下の REST API を利用します。

PUT /tweet/_create/1
{
  "date":"2020/11/01 09:00 JST",
  "Tweet":"ツイッターをはじめました。",
  "User ID":"hoge"
}

Get API (Read)

Get API とは、インデックスからドキュメントを取得する API です。
GET /test/_doc/1
{
  (中略)
  "_source" : {
    "date" : "2020/11/01 09:00 JST",
    "Tweet" : "ツイッターをはじめました。",
    "User ID" : "hoge"
  }
}

curl の場合

curl localhost:9200/test/_doc/1?pretty
{
  (中略)
  "_source" : {
    "date" : "2020/11/01 09:00 JST",
    "Tweet" : "ツイッターをはじめました。",
    "User ID" : "hoge"
  }
}

Update API (Update)

Update API とは、インデックスのドキュメントを更新する API です。
一部のフィールドを更新
POST /test/_update/1
{
  "doc": {
    "Tweet":"フィールドを更新したよ。"
  }
}
GET /test/_doc/1
  "_version" : 2
  "_source" : {
    "date" : "2020/11/01 09:00 JST",
    "Tweet" : "フィールドを更新したよ。",
    "User ID" : "hoge"
  }

"Tweet" フィールドの値が更新され、_version が 2 に変化していることがわかります。

全てのフィールド (ドキュメント) を更新
POST /test/_doc/1
{
  "Tweet":"ドキュメントを置き換えたよ"
}
GET /test/_doc/1
  "_version" : 3,
  "_source" : {
    "Tweet" : "ドキュメントを置き換えたよ"
  }

以下の3つが確認できます。

  • Tweet フィールドが上書き
  • date, User ID フィールドが消える
  • _version が 3 に変化

curl の場合

curl localhost:9200/test/_doc/1?pretty -XPOST -H "Content-Type: application/json" -d '
{
  "date":"2020/11/01 09:00 JST",
  "Tweet":"ドキュメントを更新したよ。",
  "User ID":"hoge"
}'
curl localhost:9200/test/_doc/1?pretty
{
(中略)
  "_version" : 2,
  "_source" : {
    "date" : "2020/11/01 09:00 JST",
    "Tweet" : "ドキュメントを更新したよ。",
    "User ID" : "hoge"
  }

"Tweet" フィールドの値が更新され、_version が2に変化していることがわかります。

POST <index>/_update/<_id> を使う場合

POST /test/_update/1
{
  "doc": {
    "Tweet":"ドキュメントを一部更新したよ。"
  }
}
GET /test/_doc/1
{
(中略)
  "_source" : {
    "date" : "2020/11/01 09:00 JST",
    "Tweet" : "ドキュメントを一部更新したよ。",
    "User ID" : "hoge"
  }

Delete API

Delete API とは、インデックスのドキュメントを削除する API です。
DELETE /test/_doc/1
GET /test/_doc/1
{
  "_index" : "test",
  "_type" : "_doc",
  "_id" : "1",
  "found" : false
}

found" が false となりました。("_source" のフィールドが削除されました。)

curl の場合

curl localhost:9200/test/_doc/1?pretty -XDELETE
curl localhost:9200/test/_doc/1?pretty
{
  "_index" : "test",
  "_type" : "_doc",
  "_id" : "1",
  "found" : false
}

"found" が false となりました。("_source" のフィールドが削除されました。)

Bulk API (一括処理)

Bulk API とは、1回の API 呼び出しで、複数回ドキュメントを操作可能な API です。

Bulk API で利用可能な操作は以下のとおりです。

Bulk API の操作説明
Createインデックスが存在しない場合、ドキュメントを作成
Indexインデックスのドキュメントを全て更新 (置き換え)
Updateインデックスのドキュメントを一部更新
Deleteインデックスのドキュメントを削除
POST _bulk
{ "index" : { "_index" : "test", "_id" : "1" } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_id" : "2" } }
{ "create" : { "_index" : "test", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_index" : "test"} }
{ "doc" : {"field2" : "value2"} }

curl の場合

Bulk API で操作する内容を記載した json ファイルを作成します。

{ "index" : { "_index" : "test", "_id" : "1" } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_id" : "2" } }
{ "create" : { "_index" : "test", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_index" : "test"} }
{ "doc" : {"field2" : "value2"} }
curl localhost:9200/_bulk?pretty -XPOST --data-binary @bulk.json -H "Content-Type: application/json"

ドキュメントの検索 (search API)

Elasticsearch では、search API を利用してインデックス内にあるドキュメントを検索します。

search API では、「4種類の検索条件 + ソート」で検索可能です。

クエリの種類説明
match全文検索 (転置インデックスで検索)
term完全一致検索
range範囲検索
bool複合検索
sort検索結果をソートします

それでは、今回のデモで使用するデータを用意します。

POST /_bulk
{ "index" : { "_index" : "demo_search", "_id" : "1" } }
{ "text" : "This is Elasticsearch test.", "num" : 1 }
{ "index" : { "_index" : "demo_search", "_id" : "2" } }
{ "text" : "Elasticsearch is God.", "num" : 2 }
{ "index" : { "_index" : "demo_search", "_id" : "3" } }
{ "text" : "This is a pen.", "num" : 3 }

条件無しで検索

まずは検索条件を指定せずに search API でドキュメントを検索してみます。

GET /demo_search/_search
    "hits" : [
      {
        "_index" : "demo_search",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "text" : "This is Elasticsearch test.",
          "num" : 1
        }
      },
      {
        "_index" : "demo_search",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "text" : "Elasticsearch is God.",
          "num" : 2
        }
      },
      {
        "_index" : "demo_search",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 1.0,
        "_source" : {
          "text" : "This is a pen.",
          "num" : 3
        }
      }
    ]

作成した3つのドキュメントがすべて検索できています。

match クエリ (全文検索)

match クエリとは、転置インデックスを利用して全文検索を行うクエリです。

match クエリでは、「text」データ型のフィールドに対して全文検索を行います。

これは、「text」フィールドが単語ごとに転置インデックスを作成しているためです。

These fields are analyzed, that is they are passed through an analyzer to convert the string into a list of individual terms before being indexed.

https://www.elastic.co/guide/en/elasticsearch/reference/current/text.html

フィールドのデータ型を指定する方法は、以下の記事で紹介しています。

match クエリで、 "Elasticsearch" と "god" の両方が含まれるドキュメントを全文検索します。

GET /demo_search/_search
{
  "query":{
    "match": {
      "text": {
        "query": "Elasticsearch god",
        "operator":"AND"
      }
    } 
  }
}
    "hits" : [
        (省略)
        "_source" : {
          "text" : "Elasticsearch is God."

match_phrase クエリについて

match_phrasematch_phrase クエリとは、単語の順序が一致するドキュメントだけを出力するクエリです。
GET /demo_search/_search
{
  "query":{
    "match_phrase": {
      "text": "Elasticsearch test"
    } 
  }
}
    "hits" : [
        (省略)
        "_source" : {
          "text" : "This is Elasticsearch test."
        }
      }
GET /demo_search/_search
{
  "query":{
    "match_phrase": {
      "text":{
        "query": "test Elasticsearch"
      }
    } 
  }
}
"hits" : [ ]

Term クエリ (完全一致検索)

Term クエリとは、完全一致検索を行うクエリです。

Term クエリでは、データ型が「keyword」のフィールドに対して完全一致検索を行います。

(text 型は、単語ごとに転置インデックスを作成しているので、完全一致検索ができない)

Keyword fields are often used in sortingaggregations, and term-level queries, such as term.

https://www.elastic.co/guide/en/elasticsearch/reference/current/keyword.html
GET /demo_search/_search
{
  "query":{
    "term": {
      "text.keyword": "This is Elasticsearch test."
    } 
  }
}
        "_source" : {
          "text" : "This is Elasticsearch test."

部分検索できない例

GET /demo_search/_search
{
  "query":{
    "term": {
      "text.keyword": "Elasticsearch"
    } 
  }
}
"hits" : [ ]

"Elasticsearch" は "This is Elasticsearch test." と異なるので、完全一致検索にヒットしないです。

Terms クエリ (複数形)

TermsTerms とは、Term の複数形、つまり複数の完全一致検索をするクエリです。
GET /demo_search/_search
{
  "query":{
    "terms": {
      "text.keyword":["This is Elasticsearch test.","This is a pen."]
    } 
  }
}
"_source" : {
          "text" : "This is Elasticsearch test."
        }
        (中略)
        "_source" : {
          "text" : "This is a pen."
        }

Range クエリ (範囲検索)

Range クエリとは、指定した値を元に範囲検索するクエリです。
GET /demo_search/_search
{
  "query":{
    "range": {
      "num":{
        "gte": "1",
        "lte": "2"
      }
    } 
  }
}
    "hits" : [
      {
        "_index" : "demo_search",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "text" : "This is Elasticsearch test.",
          "num" : 1
        }
      },
      {
        "_index" : "demo_search",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "text" : "Elasticsearch is God.",
          "num" : 2
        }
      }

num フィールドの値が1以上、2以下のドキュメントを検索できました。

bool クエリ (複合検索)

bool クエリとは、match クエリ、term クエリ、range クエリに対して AND, OR, NOT 等を実行するクエリです。

bool クエリには、以下の4種類のクエリが存在します。

bool クエリの種類説明
must クエリAND 条件
should クエリOR 条件
must_not クエリNOT 条件
filter クエリフィルタリング
must クエリ
must クエリとは、AND 条件を表すクエリです。
GET /demo_search/_search
{
  "query":{
    "bool": {
      "must":[
        {"match":{"text":"Elasticsearch"}},
        {"range":{"num":{"lte":"1"}}}
      ]
    } 
  }
}
        "_source" : {
          "text" : "This is Elasticsearch test.",
          "num" : 1
        }

「text = "Elasticsearch" を含む」AND「num = 1以下」のドキュメントを検索できています。

should クエリ
should クエリとは、OR 条件を表すクエリです。
GET /demo_search/_search
{
  "query":{
    "bool": {
      "should":[
        {"match":{"text":"God"}},
        {"range":{"num":{"gte":"2"}}}
      ]
    } 
  }
}
    "hits" : [
      {
        "_index" : "demo_search",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 2.0596457,
        "_source" : {
          "text" : "Elasticsearch is God.",
          "num" : 2
        }
      },
      {
        "_index" : "demo_search",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 1.0,
        "_source" : {
          "text" : "This is a pen.",
          "num" : 3

「text = "God" を含む」OR「num = 2以上」のドキュメントを検索できています。

なお、両方の条件を満たすドキュメントのほうが "_score" の値が高くなります。

must_not クエリ
must_not クエリとは、NOT 条件を表すクエリです。
GET /demo_search/_search
{
  "query":{
    "bool": {
      "must_not":[
        {"match":{"text":"Elasticsearch"}},
        {"range":{"num":{"lte":"1"}}}
      ]
    } 
  }
}
    "hits" : [
      {
        "_index" : "demo_search",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 0.0,
        "_source" : {
          "text" : "This is a pen.",
          "num" : 3
        }
      }

「text = "Elasticsearch" を含まない」AND「num = 1以下でない」ドキュメントを検索できました。

つまり、"_score" が 0 のドキュメントです。

filter クエリ
filter クエリとは、指定したドキュメント以外を検索結果から除外するクエリです。
GET /demo_search/_search
{
  "query":{
    "bool": {
      "must": [
        {"match":{"text":"Elasticsearch"}}
      ], 
      "filter":[
        {"range":{"num":{"lte":"1"}}}
      ]
    } 
  }
}
        "_source" : {
          "text" : "This is Elasticsearch test.",
          "num" : 1
        }

"text" = "Elasticsearch is God." は must 条件に一致しますが、"num" = 2 のため、検索結果から除外されています。

sort クエリ

sort クエリとは、クエリの結果を指定したフィールドでソートするクエリです。
GET /demo_search/_search
{
  "sort": [
    {
      "num": {
        "order": "desc"
      }
    }
  ]
}
"_source" : {
          "text" : "This is a pen.",
          "num" : 3
        },
        "sort" : [
          3
        ]
        (中略)
        "_source" : {
          "text" : "Elasticsearch is God.",
          "num" : 2
        },
        "sort" : [
          2
        ]
        (中略)
        "_source" : {
          "text" : "This is Elasticsearch test.",
          "num" : 1
        },
        "sort" : [
          1
        ]

num フィールドの値を用いて、降順 (desc) となっています。

関連情報

関連記事

  1. Elasticsearch とは (概要/できること/検索方法)
  2. マッピング管理とテンプレート
  3. Analyzer の設定 (日本語検索、トークナイズ)
  4. 集計・分類 (Aggregations)
  5. Dynamic index settings の変更
  6. データ構造

参考文献

公式ドキュメント

Elasticsearch Guide [8.12] | Elastic