Search 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など)とはまったく対照的です。