Search API
editSearch API
editシンプルな検索をいくつか始めてみましょう。検索を実行する基本的な方法は2つあります。 一つはRESTリクエストURIを使用して検索パラメータを送信する方法で、もう一つはRESTリクエストボディを使用して検索パラメータを送信する方法です。リクエストボディ方式では、表現がより豊かになり、読みやすいJSON形式で検索を定義することもできます。リクエストURI方式の一例を試しますが、このチュートリアルではこれよりリクエストボディ方式のみを使用します。
検索用のREST APIは、`_search`エンドポイントからアクセスできます。次の例は、bankインデックスにすべてのドキュメントを返します。
GET /bank/_search?q=*&sort=account_number:asc&pretty
最初に、search呼び出しを分析します。検索(`_search`エンドポイント)はbankインデックス内で実行しており、`q=*`パラメータは、インデックス内のすべてのドキュメントに一致するようElasticsearchに指示します。`sort=account_number:asc`パラメータは、各ドキュメントの`account_number`フィールドを使用して結果を昇順でソートすることを示します。`pretty`パラメータは、pretty-printされたJSON結果を返すようElasticsearchに指示しています。
次のような応答が返ります(部分的に表示)。
{ "took" : 63, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 }, "hits" : { "total" : 1000, "max_score" : null, "hits" : [ { "_index" : "bank", "_type" : "account", "_id" : "0", "sort": [0], "_score" : null, "_source" : {"account_number":0,"balance":16623,"firstname":"Bradshaw","lastname":"Mckenzie","age":29,"gender":"F","address":"244 Columbus Place","employer":"Euron","email":"bradshawmckenzie@euron.com","city":"Hobucken","state":"CO"} }, { "_index" : "bank", "_type" : "account", "_id" : "1", "sort": [1], "_score" : null, "_source" : {"account_number":1,"balance":39225,"firstname":"Amber","lastname":"Duke","age":32,"gender":"M","address":"880 Holmes Lane","employer":"Pyrami","email":"amberduke@pyrami.com","city":"Brogan","state":"IL"} }, ... ] } }
応答については、次の部分がわかります。
-
took
- Elasticsearchが検索の実行にかかった時間(ミリ秒) -
timed_out
- 検索がタイムアウトしたかどうかを示す -
_shards
- 検索されたシャードの数と検索に成功/失敗したシャードの数を示す -
hits
- 検索結果 -
hits.total
- 検索基準に一致したドキュメントの数 -
hits.hits
- 検索結果の実際の配列(デフォルトで最初の10個のドキュメント) -
hits.sort
- 結果のソートキー(スコアでソートする場合は欠落) -
hits._score`と`max_score
- 今のところこれらのフィールドは無視
次に、代替のリクエストボディ方式を使用する、上記と同じ検索を示します。
GET /bank/_search { "query": { "match_all": {} }, "sort": [ { "account_number": "asc" } ] }
違いは、URIでq=*
を渡すのではなく、JSON形式のクエリリクエストボディを_search
APIにPOSTする点です。このJSONクエリについては、次のセクションで説明します。
検索結果を返すと、Elasticsearchはリクエストを完了して、サーバー側のリソースを保守したり結果にカーソルを開いたりしないことを理解しておいてください。これは、あらかじめクエリ結果の部分的なサブセットを得ることができ、ステートフルサーバー側カーソルなどを使用して残りの結果をフェッチ(またはページング)したい場合は、続けてサーバーに戻す必要があるという点で、他の多くのプラットフォーム(SQLなど)とはまったく対照的です。