CRUD操作を使用してElasticSearchでデータを操作する方法
ステータス:非推奨
この記事では、サポートされなくなったバージョンのUbuntuについて説明します。 現在Ubuntu12.04を実行しているサーバーを運用している場合は、サポートされているバージョンのUbuntuにアップグレードまたは移行することを強くお勧めします。
理由: Ubuntu 12.04は2017年4月28日に保守終了(EOL)に達しました and no longer receives security patches or updates. This guide is no longer maintained.
代わりに参照してください:このガイドは参照として役立つ場合がありますが、他のUbuntuリリースでは機能しない場合があります。 可能な場合は、使用しているUbuntuのバージョン用に作成されたガイドを使用することを強くお勧めします。 ページ上部の検索機能を使用して、より新しいバージョンを見つけることができます。
序章
Webアプリケーションとサイトの柔軟な検索とインデックス作成は、ほとんどの場合便利であり、時には絶対に不可欠です。 データを管理し、HTTPメソッドを介してデータを取得して操作できるようにする複雑なソリューションは数多くありますが、 ElasticSearch は、その簡単な構成と驚異的な順応性により人気を博しています。
この記事では、ElasticSearchを特定のニーズに利用するためにElasticSearchを操作する方法について説明します。 これをUbuntu12.04VPSでデモンストレーションします。
従うには、このチュートリアルを使用してElasticSearchをインストールする必要があります。 プロジェクトのサイトから提供された最新の.debファイルを使用してElasticSearchをインストールしたと想定します。
ElasticSearchの仕組み
ElasticSearchの使用法の要点を掘り下げる前に、ソフトウェアがそのソリューションをどのように実装しているかを知ることが重要です。
ElasticSearchは、さまざまな方法で対話できるRESTfulAPIを提供します。 これは基本的に、クライアントとサーバーが相互作用する方法を説明する一種のインターフェースです。 サーバーが「RESTful」であると言われる場合、サーバーは一般的なHTTPメソッド(GET、POST、PUT、DELETE)を介して対話する方法を提供し、状態情報を維持しません。 各リクエストは独立しており、リソースはJSONなどの一般的なテキスト形式で返されます。
ElasticSearchは、HTTP動詞を使用してデータを操作できるようにするAPIを公開し、URIコンポーネントを使用してパラメーターと情報を渡します。 これは、URIのフォーマット方法に基づいてデータを格納することを意味します。
通常のElasticSearchインタラクションでは、使用する操作を指定して、後続のデータに対して実行するアクションの種類を決定します。 情報を取得するには、GET
コマンドを使用できます。 レコードを作成または更新するには、PUT
またはPOST
コマンドを使用できます。
CRUDメソッドの実装
CRUDは、作成、読み取り、更新、および削除の略です。 これらはすべて、永続的なデータストレージを効果的に管理するために必要な操作です。 幸いなことに、これらにはHTTPメソッドにも論理的に同等のものがあり、標準のメソッドを使用して簡単に対話できます。 CRUDメソッドは、HTTPメソッドPOST、GET、PUT、およびDELETEによってそれぞれ実装されます。
ElasticSearchは、これらすべての機能を実行できるAPIアクセスを提供します。 これらのタイプの操作を実行する方法の観点からElasticSearchについて説明します。
説明を簡単にするために、curl
を使用してデモンストレーションを行います。これは、HTTPメソッドを明示的に指定でき、ターミナルセッションからElasticSearchを簡単に操作できるためです。
サーバーのポート9200にアクセスすると、デフォルトでElasticSearchにアクセスできます。
コンテンツを作成する
ElasticSearchでのオブジェクトの作成は、通常、インデックス作成と呼ばれます。 これは、ストアにデータを追加し、カテゴリを決定するプロセスにすぎません。 HTTPメソッドPUTまたはPOSTを使用してElasticSearchでオブジェクトを作成できます。
最も単純な形式では、データを投稿する index 、保存するオブジェクトの type 、および保存するオブジェクトのidを指定できます。 。 一般的に、これは次のようになります。
curl -X PUT http://server_name.com:9200/ index / type / object_id -d'{ } '
このシナリオでは、インデックスはデータベースと考えることができます。 これは、一部の情報を他の情報から分離できる最上位の組織単位です。 たとえば、これを使用してアプリケーションまたはサイトのデータを分離することができます。
タイプは任意のタイプ分類です。 何でもかまいませんが、特定の情報をグループ化するために使用できます。 たとえば、「ユーザー」または「ドキュメント」のデータ型を持つことができます。
IDは、PUTコマンドを使用して作成する場合は指定でき、POSTコマンドを使用する場合は省略して自動生成できます。
-d
フラグの後に、保存するオブジェクトを渡します。 これは、柔軟な形式のJSONのようなオブジェクトです。 カテゴリはその場で作成されるので、好きなものを指定できます。
たとえば、遊具のインデックスを作成している場合、次のようにスライドにインデックスを付けることができます。
curl -XPUT "http://localhost:9200/playground/equipment/1" -d ' { "type": "slide", "quantity": 2 }'
操作が成功したことを示す応答が返されます。
{"ok":true,"_index":"playground","_type":"equipment","_id":"1","_version":1}
ご覧のとおり、これは基本的に、提供した情報でインデックスが作成されたことを示しています。 また、あなたの情報がバージョン管理されていることに気付くかもしれません。 これは、後でクエリを実行する場合に役立ちます。
PUTコマンドを使用して情報を更新および作成できるため、既存のレコードを更新するのではなく、レコードを作成することを指定することをお勧めします。 これを行うには、URIの最後に/_create
を追加するだけです。
curl -XPUT "http://localhost:9200/playground/equipment/1/_create" -d '{ "type": "slide", "quantity": 2 }'
これにより、ドキュメントがすでに存在する場合、API呼び出しはエラーを返します。
{"error":"DocumentAlreadyExistsException[[playground][2] [equipment][1]: document already exists]","status":409}
コンテンツを読む
インデックスにデータを追加することの全体的なポイントは、後でそのデータを取得できるようにすることです。 HTTP GETメソッドを使用してAPIにアクセスし、コンテンツを読み取ります。
データを取得する最も基本的な方法は、インデックス、タイプ、およびIDで正確なオブジェクトを指定することです。
curl -XGET "http://localhost:9200/playground/equipment/1"
これにより、オブジェクトの作成時に受け取ったドキュメントに関する情報が返されます。 この出力に追加されるのは、_source
と呼ばれるキーで、ドキュメント自体が値として含まれています。
{"_index":"playground","_type":"equipment","_id":"1","_version":2,"exists":true, "_source" : { "type": "slide", "quantity": 1 }}
私たちの目的のために、おそらく出力をより人間に優しいものにしたいので、リクエストの最後に?pretty
を追加できます。
curl -XGET "http://localhost:9200/playground/equipment/1?pretty"
{ "_index" : "playground", "_type" : "equipment", "_id" : "1", "_version" : 2, "exists" : true, "_source" : { "type": "slide", "quantity": 1 } }
多くの場合、ドキュメント自体のみを返したいと思うでしょう。 これを行うには、クエリ文字列に/_source
を追加します。
curl -XGET "http://localhost:9200/playground/equipment/1/_source?pretty"
{ "type": "slide", "quantity": 1 }
特定のフィールドのみを返したい場合は、クエリの最後に?fields=<field1>,<field1>
を追加することで返すことができます。
curl -XGET "http://localhost:9200/playground/equipment/1?fields=type"
これにより、フィルター処理された_source
を含むJSONオブジェクトを含むfieldsというキーが追加されます。
{"_index":"playground","_type":"equipment","_id":"1","_version":2,"exists":true,"fields":{"type":"slide"}}
コンテンツを更新する
HTTP POSTコマンドを使用すると、コンテンツを簡単に更新できます。 これにより、インラインスクリプトとパラメータを使用してデータを変更できるようになります。 もう1つのオプションは、PUTコマンドを使用し、基本的に、置換(更新)オブジェクトを使用してオブジェクトを「再作成」することです。
POSTコマンドを使用し、URIに/_update
を追加して、データオブジェクトを更新できます。 キーscript
とparams
を持つオブジェクトを渡します。 プレフィックスctx._source
を使用して、ドキュメント内で内部的に定義されたキーを参照できます。
たとえば、プレイグラウンドのスライドの数を更新するには、次のように入力します。
curl -XPOST "http://localhost:9200/playground/equipment/1/_update" -d '{ "script": "ctx._source.quantity += step", "params": { "step": 1 } }'
この操作を行った後にデータを読み取ると、「数量」が増加していることがわかります。
curl -XGET "http://localhost:9200/playground/equipment/1/_source"
{"type":"slide","quantity":3}
オブジェクトを更新し、新しいキーに値を割り当てるだけで、任意の新しいフィールドを追加できます。
curl -XPOST "http://localhost:9200/playground/equipment/1/_update" -d '{ "script": "ctx._source.name_of_new_key = \"value of new field\"" }'
エンジンの混乱を避けるために、引用符をエスケープする必要がある場合があることに注意してください。
ソースの.remove
メソッドを呼び出し、フィールド名を渡すことによって、フィールドを削除することもできます。
curl -XPOST "http://localhost:9200/playground/equipment/1/_update" -d '{ "script": "ctx._source.remove(\"name_of_new_key\")" }'
スクリプトの受け渡しが複雑すぎて実行しようとしている操作ができない場合は、更新するフィールドを参照し、前の「スクリプト」の代わりに「doc」キーを使用して新しい値を渡すこともできます。例:
curl -XPOST "http://localhost:9200/playground/equipment/1/_update" -d '{ "doc" : { "type": "swing" } }'
これで、ドキュメントを再び見つけることができ、その「タイプ」は「スイング」に置き換えられました。
curl -XGET "http://localhost:9200/playground/equipment/1/_source"
{"type":"swing","quantity":3}
コンテンツを削除する
ElasticSearchでの削除操作はかなり簡単です。 IDが一致するドキュメントを削除するだけです。 DELETEコマンドを使用して、HTTP経由でこれに到達できます。
たとえば、プレイグラウンドインデックス内のIDが36のドキュメントを削除するには、次のコマンドを使用できます。
curl -XDELETE "http://localhost:9200/playground/equipment/36"
{"ok":true,"found":true,"_index":"playground","_type":"equipment","_id":"36","_version":2}
これは、操作が成功したことを示しています。 コマンドに一致するオブジェクトがなかった場合は、代わりに次のような応答が返されます。
{"ok":true,"found":false,"_index":"playground","_type":"equipment","_id":"36","_version":1}
「見つかった」キーは、一致するオブジェクトが見つかって処理されたかどうかを示すキーです。
コンテンツを検索する
/_search
URIコンポーネントを渡すことで、オブジェクトを検索できます。 これは、検索するレルムに応じて、サーバー自体の後、インデックスの後、またはタイプの後に使用できます。
たとえば、サーバー上のすべての「4」を検索するには、次のような検索文字列を使用できます。
curl -XGET "http://localhost:9200/_search?q=quantity:4'
{"took":5,"timed_out":false,"_shards":{"total":25,"successful":25,"failed":0},"hits":{"total":1,"max_score":1.0,"hits":[{"_index":"playground","_type":"equipment","_id":"1","_score":1.0, "_source" : {"type":"slide","quantity":4}}]}}
これは、「きれいな」パラメータを渡すことが役立つ別の領域です。
curl -XGET "http://localhost:9200/_search?q=quantity:4&pretty"
{ "took" : 14, "timed_out" : false, "_shards" : { "total" : 25, "successful" : 25, "failed" : 0 }, "hits" : { "total" : 1, "max_score" : 1.0, "hits" : [ { "_index" : "playground", "_type" : "equipment", "_id" : "1", "_score" : 1.0, "_source" : {"type":"slide","quantity":4} } ] } }
遊具のみで検索し、他のエリアを除外したい場合は、インデックスを含めて検索ドメインを変更し、URIに入力することができます。
curl -XGET "http://localhost:9200/playground/equipment/_search?q=quantity:4&pretty"
タイプを指定したいがインデックスを除外したい場合は、インデックスを_all
に置き換えることができます。
curl -XGET "http://localhost:9200/_all/equipment/_search?q=quantity:4&pretty"
ElasticSearchドメイン固有言語を使用して検索することもできます。これは、標準のJSONによく似たドキュメントとして渡されます。
curl -XGET "http://localhost:9200/playground/equipment/_search" -d '{ "query": { "term": { "type": "slide" } } }'
結果を検索およびフィルタリングするためのオプションは他にもたくさんありますが、これは、保存したデータを取得する方法の良い基礎を提供します。
結論
ElasticSearchは、テキストオブジェクトに簡単かつ動的にインデックスを付けることができる柔軟なソリューションです。 プログラムでコンテンツにインデックスを付けることができる場合、このソリューションは、アプリケーションまたはユーザーが利用できる検索結果を生成する機能の点でほぼ無限です。
この記事ではElasticSearchの使用方法の基本的な概念をいくつか紹介しますが、プログラムやサイトを介して検索を操作する方法は完全にあなた次第です。 これをツールとして利用して、基本的な検索機能をすばやく取得したり、非常にきめ細かい方法でデータにアクセスできるようにする精巧なオブジェクトのインデックス作成を作成したりできます。 ElasticSearchは、アプリケーションのニーズに対応するために接続できる単なるエンジンです。