デフォルト[ElasticSearch]データ処理(追加、クエリー、変更、削除)


リファレンスリンク


[Elasticsearch]Elastic Search突撃検査(2)-データ処理
[Elastic] 1. 「フレックス自動補完ガイド」-「修正前調査票」
参考書📚: 始めよう!だんせい研究

ElasticSearch構造


前にも言いましたが、もう一度復習するために、整理してから行きます!

Elastic Searchの構造は、リレーショナル・データベースと比較して、次のように理解できます.
Unixでは、Elastic SearchのREST APIを使用するcurlコマンドは、次の形式で使用されます.
curl -X{메서드} http://host:port/{인덱스}/{타입}/{도큐먼트 id} -d '{데이터}'
  • ここでの方法は、HTTP通信方法POST、GET、PUT、DELETE
  • である.
  • インデックスはallコマンドですべてのインデックス
  • を表すことができる.
  • データフォーマット常にJSON文書
  • ElasticSearchデータ処理


    データ入力


    Unixのcurlコマンドで入力できますが、Postmanでデータを簡単に処理したいと思います.
    PUTメソッドを入力した/index/type/documentidは、indexまたはtypeが存在しない場合、Elasticsearchによって自動的に作成される対応するデータを自動的に生成します.
    document idを自動的に生成するにはtypeを指定してPOSTマッピングを行うだけです.この場合、idは自動的に生成されます.

    typeの設定中にno handler for uriエラーが見つかりました



    参考資料を探してみると、ElasticSearchバージョン8からtype登録の仕方が変わったため、uriで登録することができませんでした.
    当時使用されていたバージョンは8.1.2で、このメソッドは実行できず、上記のエラーが発生しました.
    適切なバージョンの方法を見つけることができますが、あまり例や参考にならないし、新しいバージョンがリリースされたばかりなので、既存のバージョン7を再ダウンロードすることにしました.

    新しくダウンロードしたフレックス検索では、うまく動いていることがわかります!

    🌺データの変更


    再度、PUTメソッドを使用して同じインデックス、タイプ、およびアイデンティティ値を持つドキュメントを入力すると、既存のデータが削除され、新しく入力したデータが上書きされます.

    データ更新(update)API


    Elastic Searchはupdate APIを提供し、入力したドキュメントを変更できます.
    update APIの2つのパラメータdocとscriptを使用して、データを制御できます.
    docパラメータは、ドキュメントに新しいフィールドを追加したり、既存のフィールド値を変更したりするために使用します.
    scripパラメータは、入力内容に基づいてフィールド値を変更するなど、より複雑なプログラミングテクニックを使用します.
    update APIはPOSTメソッドを使用し、以下のURIを使用します.
    curl -XPOST httpL//host:port/인덱스/타입/도큐먼트id/_update -d'업데이트 명령어'
    これは、上述したPUT方式を用いてデータを修正することとは異なる.
    PUTメソッドを使用してデータを変更すると、既存のデータが削除され、新しく入力したデータが上書きされます.
    update APIは追加するデータのみ追加できます
    たとえば、books/book/1には次のデータがあります.
     "category": "book",
     "title": "elasticsearch"
    ここに著者の「author」フィールドを追加する場合は
  • PUTを使用して作成者を追加-以下のデータをすべてbook/book/1に入れます.
  •  {
         "category": "book",
         "title": "elasticsearch",
         "author": "lee"
     }
  • update APIを使用する方法-追加した作成者ソースのみpostをbooks/book/1/updateにマッピング
     {
         "doc" : {"author": "lee"}
     }
    この場合、上記の方法ではdocでパラメータを与えるので、パラメータdocを明記する必要がある

    _update API : script


    上のdocパラメータは簡単ですが、scriptはsourceのドキュメントコンテンツに複数の演算を適用できます.
    scriptはMVEL言語の構文を用いて処理する.
    ソースのドキュメントの内容を変更するには、scriptのctx._sourceコマンドを使用します.
    たとえば、books/book/1のsourceで「page」:250と呼ばれる場合、scriptコマンドを使用して値を50に加算できます.
    postマッピングを使用してbooks/book/1/updateをuriとして提供します.
    {
        "script":"ctx._source.page += 50"
    }
    上記bodyが発行されると、sourceのpageは50増加して更新される.
    今回はもう少し深化して、既存のbookのsourceの中で作者leeだけの内容をkimの配列に追加します
    1.まずdocパラメータで単一データleeを配列形式に変更する
    {
        "doc":
        {
            "author":["Lee"]
        }
    }
    2.後でkimをscriptパラメータとしてauthorフィールドに追加します.
    🌟配列に特定の値を追加するには、追加する値を特定の変数に保存し、.+=変数を追加する配列フィールドに演算で追加します.
    {
       "script":{
           "source" : "ctx._source.author.add(params.new_author)",
            "params" : { "new_author" : "Kim"}
       }
    }
    配列形式で作成せずに+=演算を直接行うとLeeKimのようにStringがマージされるので注意.
    今回if文で条件文を処理
    authorフィールドにkimが含まれている場合はpageを100に設定し、そうでない場合は200に設定します.
    値が含まれているかどうかはjava構文に従ってcontainsを使用できます.
    {
        "script": {
           "source":  "if(ctx._source.author.contains(params.auth)) {ctx._source.page = 100} else {ctx._source.page = 200}",
            "params" : {"auth" : "Kim"}
        }
    }
    contains()関数のほか、Java言語で使用される=.=<.!=同様の比較演算も使用できます.
  • ctx.opコマンドを使用して、フィールド条件に基づいてドキュメントを削除できます.
  • {
        "script": {
           "source": "if(ctx._source.page <= params.page_count) {ctx.op = \"delete\"}else{ ctx.op = \"none\"}",
            "params" : {"page_count" : 100}
        }
    }
  • upsertは、そのエンティティが存在しない場合に、エンティティを定義するコマンドを生成する.
    プロンプトが存在しない場合、upsertは設定する初期値を定義します.
    upsertで初期値を設定したフィールドが既存のドキュメントに存在しない場合は、ドキュメントがフィールドを持つ新しいドキュメントとして再定義されることに注意してください.
  • {
        "script": {
           "source": "ctx._source.counter += params.count",
            "params" : {"count" : 1}
            },
        "upsert" : {"counter":0}
    }

    データ消去


    DELETEメソッドを使用してドキュメントデータを削除しても、ドキュメントのメタデータは存在します.ドキュメントを削除すると、ドキュメントのsourceに入力されたデータ値が空の値に更新され、実際にドキュメントを削除するのではなく、ステータスが変化すると理解できます.
    DELETEメソッドを使用した削除コマンドは、タイプやインデックス単位としても使用できます.
    ドキュメント単位でデータを削除するのとは異なり、ドキュメントのすべてのメタデータ情報が削除されます.