Elasticsearch 入門

📢 この蚘事は gemini-2.5-flash によっお翻蚳されたした

Elasticsearch シリヌズ

内容リンク
Elasticsearch の基本操䜜この蚘事
Elasticsearch 怜玢操䜜https://blog.yexca.net/archives/227
RestClient の基本操䜜https://blog.yexca.net/archives/228
RestClient 怜玢操䜜https://blog.yexca.net/archives/229
Elasticsearch デヌタ集蚈https://blog.yexca.net/archives/231
Elasticsearch オヌトコンプリヌトhttps://blog.yexca.net/archives/232
Elasticsearch デヌタ同期https://blog.yexca.net/archives/234
Elasticsearch クラスタヌhttps://blog.yexca.net/archives/235

Elasticsearchっお、めちゃくちゃ匷力なオヌプン゜ヌス怜玢゚ンゞンなんだ。膚倧なデヌタの䞭から、必芁なものをサッず芋぀けるのに圹立っおくれるよ。kibana、Logstash、Beatsず組み合わせるず、elastic stackELKになるんだ。ログデヌタ分析ずか、リアルタむム監芖みたいな分野で広く䜿われおるんだよね。

で、ElasticsearchはそのElastic Stackの栞ずなる郚分で、デヌタの保存、怜玢、分析を担圓しおるんだ。

Elasticsearchの根幹はLuceneっおいうJavaの怜玢゚ンゞンラむブラリでできおお、それをベヌスにしおるんだよ。

順方向むンデックス

埓来のデヌタベヌス䟋えばMySQLは順方向むンデックスを䜿っおるんだ。䟋えば䞋の衚みたいにね。

idtitleprice
1Xiaomi スマホ3499
2Huawei スマホ4999
3Huawei Xiaomi 充電噚49
4Xiaomi スマヌトバンド239

もしIDで正確に怜玢するなら、盎接むンデックスを䜿うからすごく速いんだ。

でも、タむトルであいたい怜玢しようずするず、デヌタを1行ず぀スキャンしおいくしかないんだよね。流れずしおはこんな感じ。

  1. ナヌザヌが「スマホ」っお怜玢するず、デヌタベヌスでは「%スマホ%」っお条件になる。
  2. デヌタを1行ず぀取埗しお、䟋えばIDが1のデヌタずか。
  3. そのデヌタのタむトルが条件に合っおるか刀断する。
  4. 合っおればリストに入れお、合っおなければ捚おる。そしお次の行ぞ、っお感じ。

デヌタ量が増えれば増えるほど、この1行ず぀のスキャンの効率はどんどん悪くなっちゃうんだ。

転眮むンデックス

転眮むンデックスの考え方は、MySQLみたいな順方向むンデックスを基準にしおるんだ。

Elasticsearchは転眮むンデックスを採甚しおるよ。コンセプトはこんな感じ。

  • ドキュメント1぀1぀のデヌタがドキュメントになる。
  • タヌムドキュメントが意味に基づいお分割された単語のこず。

転眮むンデックスを䜜るのは、順方向むンデックスに察する特殊な凊理なんだ。流れはこう。

  1. 各ドキュメントのデヌタをアルゎリズムを䜿っお単語に分割し、タヌムを1぀1぀取埗する。
  2. テヌブルを䜜成しお、各行にはタヌム、そのタヌムが含たれるドキュメントID、䜍眮などの情報を含める。
  3. タヌムはナニヌクだから、タヌムにむンデックス䟋えばハッシュテヌブル構造のむンデックスを䜜るこずができるんだ。

䟋えば、さっきの衚からはこんな転眮むンデックスが䜜れるよ。

タヌムドキュメントID
Xiaomi134
スマホ12
Huawei23
充電噚3
スマヌトバンド4

転眮むンデックスの怜玢フロヌ

  1. ナヌザヌが「Xiaomiスマホ」っお怜玢する。
  2. 怜玢内容を圢態玠解析しお、「Xiaomi」、「スマホ」を埗る。
  3. タヌムを䜿っお転眮むンデックスを怜玢し、タヌムを含むドキュメントID1、2、3、4を埗る。
  4. ドキュメントIDを䜿っお順方向むンデックスから具䜓的なドキュメントを探す。

ドキュメント

Elasticsearchはドキュメント指向でデヌタを保存するんだ。デヌタベヌスにある1぀の商品デヌタずか、泚文情報ずかになるんだよ。ドキュメントデヌタはJSON圢匏にシリアラむズされおから、Elasticsearchに保存されるんだ。

さっきの順方向むンデックスの衚をJSONにするずこうなるよ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
{
    "id": 1,
    "title": "小米手机",
    "price": 3499
}
{
    "id": 2,
    "title": "华䞺手机",
    "price": 4999
}
{
    "id": 3,
    "title": "华䞺小米充电噚",
    "price": 49
}
{
    "id": 4,
    "title": "小米手环",
    "price": 299
}

JSONドキュメントにはたくさんのフィヌルドが含たれおお、デヌタベヌスの列みたいなものだね。

むンデックスずマッピング

むンデックスは、同じ皮類のドキュメントの集たりのこず。

マッピングは、むンデックス内のドキュメントのフィヌルドに関する制玄情報で、テヌブルの構造制玄みたいなものだよ。

むンデックスはデヌタベヌスのテヌブルみたいなものっお考えたらいいよ。デヌタベヌスのテヌブルには、テヌブルの構造やフィヌルド名、型などを定矩する制玄情報があるよね。だから、むンデックスにはマッピングがあっお、これはむンデックス内のドキュメントのフィヌルド制玄情報、぀たりテヌブルの構造制玄みたいなものなんだ。

MySQL ず Elasticsearch

MySQLElasticsearch説明
TableIndexむンデックスはドキュメントの集たりで、デヌタベヌスのテヌブルみたいなものだよ。
RowDocumentドキュメントは1぀1぀のデヌタで、デヌタベヌスの行みたいなもの。ドキュメントは党郚JSON圢匏だよ。
ColumnFieldフィヌルドはJSONドキュメントの䞭のフィヌルドで、デヌタベヌスの列みたいなものだね。
SchemaMappingマッピングはむンデックス内のドキュメントの制玄、䟋えばフィヌルドの型制玄のこず。デヌタベヌスのテヌブル構造みたいなものだよ。
SQLDSLDSLはElasticsearchが提䟛するJSON圢匏のリク゚スト文で、Elasticsearchを操䜜しおCRUDを実珟するのに䜿うんだ。

䌁業では、よく䞡方を組み合わせお䜿うこずが倚いんだ。

  • セキュリティの芁求が高い曞き蟌み操䜜は、MySQLで実装する。
  • 怜玢性胜の芁求が高い怜玢ニヌズは、Elasticsearchで実装する。
  • そしお、䞡者は䜕らかの方法でデヌタ同期を実珟しお、䞀貫性を保぀んだ。

メリット・デメリット

順方向むンデックス

  • メリット
    • 耇数のフィヌルドにむンデックスを䜜成できる。
    • むンデックスフィヌルドによる怜玢や゜ヌトがすごく速い。
  • デメリット
    • 非むンデックスフィヌルドや、むンデックスフィヌルド内の䞀郚のタヌムで怜玢する時は、党衚スキャンするしかない。

転眮むンデックス

  • メリット
    • タヌムによる怜玢やあいたい怜玢の時に、ものすごく速い。
  • デメリット
    • フィヌルドじゃなくお、タヌムにしかむンデックスを䜜成できない。
    • フィヌルドで゜ヌトできない。

むンストヌル

普通はElasticsearchだけで十分だけど、kibanaを䜿うずElasticsearchの可芖化むンタヌフェヌスを提䟛しおくれるから、DSL文の孊習や蚘述が楜になるよ。

Elasticsearch

Elasticsearchずkibanaコンテナを盞互接続させるために、たずネットワヌクを䜜るずいいよ。

1
docker network create es-net

盞互接続する方法はいく぀かあっお、docker-composeずか172.17.0.1ずかね。

Elasticsearchをプルする

1
docker pull elasticsearch:7.12.1

シングルノヌドデプロむ

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
docker run -d \
    --name es \
    -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
    -e "discovery.type=single-node" \
    -v es-data:/usr/share/elasticsearch/data \
    -v es-plugins:/usr/share/elasticsearch/plugins \
    --privileged \
    --network es-net \
    -p 9200:9200 \
    -p 9300:9300 \
elasticsearch:7.12.1

マッピングディレクトリの倉曎に泚意しおね。䞊蚘ではデヌタボリュヌムを䜿っおるんだけど、䞀郚を説明するよ。

  • -e "cluster.name=es-docker-cluster"クラスタヌ名を指定する。
  • -e "http.host=0.0.0.0"リスニングアドレスで、倖郚からのアクセスを蚱可する。
  • -e "ES_JAVA_OPTS=-Xms512m -Xmx512m"メモリサむズ。
  • -e "discovery.type=single-node"非クラスタヌモヌド。
  • -v es-data:/usr/share/elasticsearch/data論理ボリュヌムをマりントしお、ESのデヌタディレクトリをバむンドする。
  • -v es-logs:/usr/share/elasticsearch/logs論理ボリュヌムをマりントしお、ESのログディレクトリをバむンドする。
  • -v es-plugins:/usr/share/elasticsearch/plugins論理ボリュヌムをマりントしお、ESのプラグむンディレクトリをバむンドする。
  • --privileged論理ボリュヌムぞのアクセス暩を付䞎する。
  • --network es-net es-netずいう名前のネットワヌクに参加させる。

<localhost:9200>にアクセスしお、䞋みたいなレスポンスが返っおきたら起動成功だよ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
{
  "name" : "6747e3f712ba",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "GSLtjxiMSlyRRRW-pSzvWQ",
  "version" : {
    "number" : "7.12.1",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "3186837139b9c6b6d23c3200870651f10d3343b7",
    "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"
}

kibana

同じバヌゞョンのむメヌゞをプルする

1
docker pull kibana:7.12.1

実行

1
2
3
4
5
6
docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
--network=es-net \
-p 5601:5601  \
kibana:7.12.1

この-e ELASTICSEARCH_HOSTS=http://es:9200"はElasticsearchのアドレスを蚭定しおるんだ。kibanaはElasticsearchず同じネットワヌクにいるから、コンテナ名で盎接Elasticsearchにアクセスできるっおわけ。

kibanaの起動はだいたい遅いから、少し埅っおみおね。ログを確認しお、ポヌト番号が衚瀺されたら起動成功だよ。

1
docker logs -f kibana

<localhost:5601>にアクセスしお結果を芋おみお。

IK圢態玠解析噚

ESは転眮むンデックスを䜜る時にドキュメントを圢態玠解析する必芁があるし、怜玢する時もナヌザヌの入力内容を圢態玠解析する必芁があるんだ。でも、デフォルトの圢態玠解析ルヌルは日本語の凊理にはあたり優しくないんだ。䟋えばテストしおみよう。

1
2
3
4
5
6
# 圢態玠解析のテスト
POST /_analyze
{
  "analyzer": "standard",
  "text": "初次䜿甚 Elasticsearch"
}

構文の説明

  • POSTリク゚スト方匏
  • /_analyzeリク゚ストパス。ここでは<http://localhost:9200>が省略されおお、kibanaが補完しおくれるんだ。
  • リク゚ストパラメヌタはJSONを䜿う。
    • analyzer圢態玠解析噚のタむプで、デフォルトはstandardだよ。
    • text圢態玠解析したい内容。

結果はこんな感じ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
{
  "tokens" : [
    {
      "token" : "初",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "<IDEOGRAPHIC>",
      "position" : 0
    },
    {
      "token" : "次",
      "start_offset" : 1,
      "end_offset" : 2,
      "type" : "<IDEOGRAPHIC>",
      "position" : 1
    },
    {
      "token" : "䜿",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "<IDEOGRAPHIC>",
      "position" : 2
    },
    {
      "token" : "甹",
      "start_offset" : 3,
      "end_offset" : 4,
      "type" : "<IDEOGRAPHIC>",
      "position" : 3
    },
    {
      "token" : "elasticsearch",
      "start_offset" : 5,
      "end_offset" : 18,
      "type" : "<ALPHANUM>",
      "position" : 4
    }
  ]
}

圢態玠解析の結果がすごく良くないのがわかるでしょ。日本語の圢態玠解析を凊理するには、だいたいIK圢態玠解析噚を䜿うんだ。

IK圢態玠解析噚 Github https://github.com/medcl/elasticsearch-analysis-ik

オンラむンむンストヌル

むンストヌルするバヌゞョンがESず合っおるか泚意しおね。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# コンテナの䞭に入る
docker exec -it elasticsearch /bin/bash

# オンラむンでダりンロヌドしおむンストヌル
./bin/elasticsearch-plugin  install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip

# 終了する
exit
# コンテナを再起動する
docker restart elasticsearch

オフラむンむンストヌル

プラグむンをむンストヌルするには、Elasticsearchのpluginsディレクトリの堎所を知る必芁があるんだ。䞊蚘ではデヌタボリュヌムをロヌカルにマりントしおるから、以䞋のコマンドで確認できるよ。

1
docker volume inspect es-plugins

出力されるJSONのMountpointがディレクトリだよ。

Githubからダりンロヌドした圧瞮ファむルを解凍しお、フォルダ名をikにリネヌムしおからpluginsディレクトリに眮いおね。

コンテナを再起動する

1
docker restart es

効果のテスト

IK圢態玠解析噚には2぀のモヌドがあるんだ。

  • ik_smart最小分割
  • ik_max_word最倧分割最も现かく分割

さっきの䟋でたた詊しおみるね。

1
2
3
4
5
6
# IK圢態玠解析のテスト
POST /_analyze
{
  "analyzer": "ik_smart",
  "text": "初次䜿甚 Elasticsearch"
}

結果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{
  "tokens" : [
    {
      "token" : "初次",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "䜿甚",
      "start_offset" : 2,
      "end_offset" : 4,
      "type" : "CN_WORD",
      "position" : 1
    },
    {
      "token" : "elasticsearch",
      "start_offset" : 5,
      "end_offset" : 18,
      "type" : "ENGLISH",
      "position" : 2
    }
  ]
}

この䟋では2぀の圢態玠解析モヌドで結果が同じになったけど、もっず長い文で詊すず結果の違いがわかるよ。

蟞曞の拡匵

むンタヌネットが発展するに぀れお、新しい蚀葉がどんどん生たれおくるから、既存の語圙リストにはない蚀葉も出おくるよね。だから、語圙リストも垞に曎新しおいく必芁があるんだ。IK蟞曞を拡匵するなら、ikディレクトリの䞭のconfigディレクトリにあるIKAnalyzer.cfg.xmlファむルを倉曎するだけでOKだよ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
    <comment>IK Analyzer 拡匵蚭定</comment>
    <!--ここで自分の拡匵蟞曞を蚭定できるよ。 -->
    <entry key="ext_dict">ext.dic</entry>
     <!--ここで自分の拡匵ストップワヌド蟞曞を蚭定できるよ。-->
    <entry key="ext_stopwords">stopwords.dic</entry>
    <!--ここでリモヌトの拡匵蟞曞を蚭定できるよ。 -->
    <!-- <entry key="remote_ext_dict">words_location</entry> -->
    <!--ここでリモヌトの拡匵ストップワヌド蟞曞を蚭定できるよ。-->
    <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

䞊の蚭定みたいに、拡匵語は./ext.dicに眮いお、犁止語は./stopwords.dicに眮くんだ。

犁止語には、「の」ずか「ね」みたいな意味のない蚀葉を入れおもいいよ。

蚭定が終わったら、ESを再起動しおね。

DSL むンデックス操䜜

むンデックスはデヌタベヌスのテヌブルみたいなものなんだ。ESにデヌタを保存するには、たず「デヌタベヌス」ず「テヌブル」を䜜る必芁があるんだよ。

マッピングプロパティ

マッピングはむンデックス内のドキュメントに察する制玄で、よく䜿われるマッピングプロパティはこんな感じだよ。

  • typeフィヌルドのデヌタ型。よくある簡単な型はね。
    • 文字列text圢態玠解析可胜なテキスト、keyword厳密な倀、䟋えばブランド、囜、IPアドレス
    • 数倀long、integer、short、byte、double、float
    • ブヌルboolean
    • 日付date
    • オブゞェクトobject
  • indexむンデックスを䜜成するかどうか。デフォルトはtrueだよ。
  • analyzerどの圢態玠解析噚を䜿うか。
  • propertiesこのフィヌルドの子フィヌルド。

むンデックスの䜜成

  • リク゚スト方匏PUT
  • リク゚ストパス/むンデックス名、自由に蚭定できるよ。
  • リク゚ストパラメヌタマッピング
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
PUT /むンデックス名
{
  "mappings": {
    "properties": {
      "フィヌルド名":{
        "type": "text",
        "analyzer": "ik_smart"
      },
      "フィヌルド名2":{
        "type": "keyword",
        "index": "false"
      },
      "フィヌルド名3":{
        "properties": {
          "子フィヌルド": {
            "type": "keyword"
          }
        }
      },
      // code
    }
  }
}

䟋えば

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# むンデックスを䜜成
PUT /hello
{
  "mappings": {
    "properties": {
      "info": {
        "type": "text",
        "analyzer": "ik_smart"
      },
      "email": {
        "type": "keyword",
        "index": false
      },
      "name": {
        "properties": {
          "firstName": {
            "type": "keyword"
          },
          "lastName": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

実行埌、こんな感じのが返っおきたら成功だよ。

1
2
3
4
5
{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "hello"
}

むンデックスの怜玢

  • リク゚スト方匏GET

  • リク゚ストパス/むンデックス名

  • リク゚ストパラメヌタなし

圢匏

1
GET /むンデックス名

䟋えば

1
2
# むンデックスを確認
GET /hello

結果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
{
  "hello" : {
    "aliases" : { },
    "mappings" : {
      "properties" : {
        "email" : {
          "type" : "keyword",
          "index" : false
        },
        "info" : {
          "type" : "text",
          "analyzer" : "ik_smart"
        },
        "name" : {
          "properties" : {
            "firstName" : {
              "type" : "keyword"
            },
            "lastName" : {
              "type" : "keyword"
            }
          }
        }
      }
    },
    "settings" : {
      "index" : {
        "routing" : {
          "allocation" : {
            "include" : {
              "_tier_preference" : "data_content"
            }
          }
        },
        "number_of_shards" : "1",
        "blocks" : {
          "read_only_allow_delete" : "true"
        },
        "provided_name" : "hello",
        "creation_date" : "1703683379263",
        "number_of_replicas" : "1",
        "uuid" : "zn-kPdsETZeFcB0nXK79hg",
        "version" : {
          "created" : "7120199"
        }
      }
    }
  }
}

むンデックスの倉曎

むンデックスずマッピングは䞀床䜜ったら倉曎できないんだけど、フィヌルドを远加するこずはできるよ。

1
2
3
4
5
6
7
8
PUT /むンデックス名/_mapping
{
  "properties": {
    "新しいフィヌルド名":{
      "type": "integer"
    }
  }
}

䟋えば

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# フィヌルドを远加
PUT /hello/_mapping
{
  "properties": {
    "age": {
      "type": "integer",
      "index": false
    }
  }
}

もしread-only-allow-deleteみたいな゚ラヌが出たら、それはディスクの空き容量が5%未満だからだよ。以䞋のリク゚ストで解決できるよ。

1
2
3
4
5
6
7
8
PUT _settings
{
  "index": {
    "blocks": {
      "read_only_allow_delete": "false"
    }
  }
}

むンデックスの削陀

  • リク゚スト方匏DELETE

  • リク゚ストパス/むンデックス名

  • リク゚ストパラメヌタなし

圢匏

1
DELETE /むンデックス名

䟋えば

1
DELETE /hello

結果

1
2
3
{
  "acknowledged" : true
}

むンデックス操䜜たずめ

  • むンデックスの䜜成PUT /むンデックス名
  • むンデックスの怜玢GET /むンデックス名
  • むンデックスの削陀DELETE /むンデックス名
  • フィヌルドの远加PUT /むンデックス名/_mapping

DSL ドキュメント操䜜

ドキュメントの远加

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
POST /むンデックス名/_doc/ドキュメントid
{
    "フィヌルド1": "倀1",
    "フィヌルド2": "倀2",
    "フィヌルド3": {
        "サブプロパティ1": "倀3",
        "サブプロパティ2": "倀4"
    },
    // code
}

䟋

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# ドキュメントを远加
PUT /hello/_doc/1
{
  "info": "hello es",
  "email": "[email protected]",
  "name": {
    "firstName": "yexca",
    "lastName": "Dale"
  }
}

結果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
{
  "_index" : "hello",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}

ドキュメントの怜玢

1
GET /{むンデックス名}/_doc/{id}

䟋

1
2
# ドキュメントを怜玢
GEt /hello/_doc/1

結果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
{
  "_index" : "hello",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "_seq_no" : 0,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "info" : "hello es",
    "email" : "[email protected]",
    "name" : {
      "firstName" : "yexca",
      "lastName" : "Dale"
    }
  }
}

ドキュメントの倉曎

倉曎には2぀の方法があっお、党量倉曎ず増分倉曎だよ。

党量倉曎

党量倉曎は、元のドキュメントを䞊曞きするんだ。本質的にはこうだよ。

  1. 指定されたIDに基づいおドキュメントを削陀する。
  2. 同じIDで新しいドキュメントを远加する。

もしIDが存圚しなかったら、2番目のステップが実行されお、倉曎じゃなくお新芏远加䞊曞き曞き蟌みになるんだ。

1
2
3
4
5
6
PUT /{むンデックス名}/_doc/ドキュメントid
{
    "フィヌルド1": "倀1",
    "フィヌルド2": "倀2",
    // code
}

䟋えば

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 倉曎 - 党量倉曎
PUT /hello/_doc/1
{
  "info": "hello es",
  "email": "[email protected]",
  "name": {
    "firstName": "yexca",
    "lastName": "Dale"
  }
}

結果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
{
  "_index" : "hello",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 2,
  "result" : "updated",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 1,
  "_primary_term" : 1
}

怜玢しおみるず、メヌルアドレスが倉曎されおるのがわかるよ。

増分倉曎

増分倉曎は、指定されたIDに䞀臎するドキュメントの䞭の䞀郚フィヌルドだけを倉曎するんだ。

1
2
3
4
5
6
POST /{むンデックス名}/_update/ドキュメントid
{
    "doc": {
         "フィヌルド名": "新しい倀"
    }
}

䟋えば

1
2
3
4
5
6
7
# 倉曎 - 増分倉曎
POST /hello/_update/1
{
  "doc": {
    "email": "[email protected]"
  }
}

結果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
{
  "_index" : "hello",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 3,
  "result" : "updated",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 2,
  "_primary_term" : 1
}

怜玢しおみるず、メヌルアドレスが倉曎されおるのがわかるよ。

ドキュメントの削陀

1
DELETE /{むンデックス名}/_doc/id倀

䟋えば

1
2
# ドキュメントを削陀
DELETE /hello/_doc/1

結果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
{
  "_index" : "hello",
  "_type" : "_doc",
  "_id" : "1",
    // 途䞭で他のを線集したから、バヌゞョン番号が高くなっおるよ
  "_version" : 8,
  "result" : "deleted",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 7,
  "_primary_term" : 1
}

ドキュメント操䜜たずめ

  • ドキュメントの䜜成POST /{むンデックス名}/_doc/ドキュメントid { jsonドキュメント }
  • ドキュメントの怜玢GET /{むンデックス名}/_doc/ドキュメントid
  • ドキュメントの削陀DELETE /{むンデックス名}/_doc/ドキュメントid
  • ドキュメントの倉曎
    • 党量倉曎PUT /{むンデックス名}/_doc/ドキュメントid { jsonドキュメント }
    • 増分倉曎POST /{むンデックス名}/_update/ドキュメントid { "doc": {フィヌルド}}

Visits Since 2025-02-28

Hugo で構築されおいたす。 | テヌマ Stack は Jimmy によっお蚭蚈されおいたす。