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":"[email protected]","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":"[email protected]","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など)とはまったく対照的です。