一般的なオプション

すべてのElasticsearch REST APIは、以下のオプションをサポートしています。

整形された結果

リクエストに?pretty=trueを追加すると、返されるJSONは整形されます(デバッグ用にのみ使用してください!)。別のオプションは?format=yamlを設定することで、結果が(時には)より読みやすいyaml形式で返されるようになります。

人間が読みやすい出力

統計は人間(例:"exists_time": "1h"または"size": "1kb")とコンピュータ(例:"exists_time_in_millis": 3600000または"size_in_bytes": 1024)に適した形式で返されます。人間が読みやすい値は、クエリ文字列に?human=falseを追加することでオフにできます。これは、統計結果が人間の消費を意図するのではなく、監視ツールによって消費される場合に意味があります。humanフラグのデフォルトはfalseです。

日付の数学

フォーマットされた日付値を受け入れるほとんどのパラメータ(例:rangeクエリgtおよびlt、またはdaterange集計fromおよびto)は、日付の数学を理解します。

式は、nowまたは||で終わる日付文字列のいずれかであるアンカーデートから始まります。このアンカーデートの後に、1つ以上の数学的表現をオプションで続けることができます:

- +1h:1時間追加
- -1d:1日減算
- /d:最も近い日付に切り捨て

サポートされている時間単位は、期間の時間単位でサポートされているものとは異なります。サポートされている単位は:


| | |
| —- | —- |
| y | 年 |
| M | 月 |
| w | 週 |
| d | 日 |
| h | 時間 |
| H | 時間 |
| m | 分 |
| s | 秒 |

now2001-01-01 12:00:00であると仮定すると、いくつかの例は次のとおりです:


| | |
| —- | —- |
| now+1h | nowミリ秒に1時間追加。解決結果:2001-01-01 13:00:00 |
| now-1h | nowミリ秒から1時間減算。解決結果:2001-01-01 11:00:00 |
| now-1h/d | nowミリ秒から1時間減算し、UTC 00:00に切り捨て。解決結果:2001-01-01 00:00:00 |
| 2001.02.01\|\|+1M/d | 2001-02-01ミリ秒に1か月追加。解決結果:2001-03-01 00:00:00 |

レスポンスフィルタリング

すべてのREST APIは、Elasticsearchによって返されるレスポンスを減少させるために使用できるfilter_pathパラメータを受け入れます。このパラメータは、ドット表記で表現されたフィルタのカンマ区切りリストを取ります:

Python

  1. resp = client.search(
  2. q="kimchy",
  3. filter_path="took,hits.hits._id,hits.hits._score",
  4. )
  5. print(resp)

Ruby

  1. response = client.search(
  2. q: 'kimchy',
  3. filter_path: 'took,hits.hits._id,hits.hits._score'
  4. )
  5. puts response

Js

  1. const response = await client.search({
  2. q: "kimchy",
  3. filter_path: "took,hits.hits._id,hits.hits._score",
  4. });
  5. console.log(response);

コンソール

  1. GET /_search?q=kimchy&filter_path=took,hits.hits._id,hits.hits._score

応答:

コンソール-結果

  1. {
  2. "took" : 3,
  3. "hits" : {
  4. "hits" : [
  5. {
  6. "_id" : "0",
  7. "_score" : 1.6375021
  8. }
  9. ]
  10. }
  11. }

また、*ワイルドカード文字を使用して、フィールドまたはフィールド名の一部に一致させることができます:

Php

  1. $response = $client->cluster()->state();

Python

  1. resp = client.cluster.state(
  2. filter_path="metadata.indices.*.stat*",
  3. )
  4. print(resp)

Ruby

  1. response = client.cluster.state(
  2. filter_path: 'metadata.indices.*.stat*'
  3. )
  4. puts response

Go

  1. res, err := es.Cluster.State(
  2. es.Cluster.State.WithFilterPath("metadata.indices.*.stat*"),
  3. )
  4. fmt.Println(res, err)

Js

  1. const response = await client.cluster.state({
  2. filter_path: "metadata.indices.*.stat*",
  3. });
  4. console.log(response);

コンソール

  1. GET /_cluster/state?filter_path=metadata.indices.*.stat*

応答:

コンソール-結果

  1. {
  2. "metadata" : {
  3. "indices" : {
  4. "my-index-000001": {"state": "open"}
  5. }
  6. }
  7. }
  1. #### Php
  2. ``````php
  3. $response = $client->cluster()->state();
  4. `

Python

  1. resp = client.cluster.state(
  2. filter_path="routing_table.indices.**.state",
  3. )
  4. print(resp)

Ruby

  1. response = client.cluster.state(
  2. filter_path: 'routing_table.indices.**.state'
  3. )
  4. puts response

Go

  1. res, err := es.Cluster.State(
  2. es.Cluster.State.WithFilterPath("routing_table.indices.**.state"),
  3. )
  4. fmt.Println(res, err)

Js

  1. const response = await client.cluster.state({
  2. filter_path: "routing_table.indices.**.state",
  3. });
  4. console.log(response);

コンソール

  1. GET /_cluster/state?filter_path=routing_table.indices.**.state

応答:

コンソール-結果

  1. {
  2. "routing_table": {
  3. "indices": {
  4. "my-index-000001": {
  5. "shards": {
  6. "0": [{"state": "STARTED"}, {"state": "UNASSIGNED"}]
  7. }
  8. }
  9. }
  10. }
  11. }

フィルタの前に-文字を付けることで、1つ以上のフィールドを除外することも可能です:

Php

  1. $response = $client->count();

Python

  1. resp = client.count(
  2. filter_path="-_shards",
  3. )
  4. print(resp)

Ruby

  1. response = client.count(
  2. filter_path: '-_shards'
  3. )
  4. puts response

Go

  1. res, err := es.Count(
  2. es.Count.WithFilterPath("-_shards"),
  3. es.Count.WithPretty(),
  4. )
  5. fmt.Println(res, err)

Js

  1. const response = await client.count({
  2. filter_path: "-_shards",
  3. });
  4. console.log(response);

コンソール

  1. GET /_count?filter_path=-_shards

応答:

コンソール-結果

  1. {
  2. "count" : 5
  3. }

より多くの制御のために、包括的および排他的フィルタを同じ式で組み合わせることができます。この場合、排他的フィルタが最初に適用され、結果は再度包括的フィルタを使用してフィルタリングされます:

Php

  1. $response = $client->cluster()->state();

Python

  1. resp = client.cluster.state(
  2. filter_path="metadata.indices.*.state,-metadata.indices.logstash-*",
  3. )
  4. print(resp)

Ruby

  1. response = client.cluster.state(
  2. filter_path: 'metadata.indices.*.state,-metadata.indices.logstash-*'
  3. )
  4. puts response

Go

  1. res, err := es.Cluster.State(
  2. es.Cluster.State.WithFilterPath("metadata.indices.*.state,-metadata.indices.logstash-*"),
  3. )
  4. fmt.Println(res, err)

Js

  1. const response = await client.cluster.state({
  2. filter_path: "metadata.indices.*.state,-metadata.indices.logstash-*",
  3. });
  4. console.log(response);

コンソール

  1. GET /_cluster/state?filter_path=metadata.indices.*.state,-metadata.indices.logstash-*

応答:

コンソール-結果

  1. {
  2. "metadata" : {
  3. "indices" : {
  4. "my-index-000001" : {"state" : "open"},
  5. "my-index-000002" : {"state" : "open"},
  6. "my-index-000003" : {"state" : "open"}
  7. }
  8. }
  9. }

Elasticsearchは時々、_sourceフィールドの生の値を直接返すことに注意してください。_sourceフィールドをフィルタリングしたい場合は、既存の_sourceパラメータ(詳細はGet APIを参照)をfilter_pathパラメータと組み合わせることを検討してください。このように:

Php

  1. $params = [
  2. 'index' => 'library',
  3. 'body' => [
  4. 'title' => 'Book #1',
  5. 'rating' => 200.1,
  6. ],
  7. ];
  8. $response = $client->index($params);
  9. $params = [
  10. 'index' => 'library',
  11. 'body' => [
  12. 'title' => 'Book #2',
  13. 'rating' => 1.7,
  14. ],
  15. ];
  16. $response = $client->index($params);
  17. $params = [
  18. 'index' => 'library',
  19. 'body' => [
  20. 'title' => 'Book #3',
  21. 'rating' => 0.1,
  22. ],
  23. ];
  24. $response = $client->index($params);
  25. $response = $client->search();

Python

  1. resp = client.index(
  2. index="library",
  3. refresh=True,
  4. document={
  5. "title": "Book #1",
  6. "rating": 200.1
  7. },
  8. )
  9. print(resp)
  10. resp1 = client.index(
  11. index="library",
  12. refresh=True,
  13. document={
  14. "title": "Book #2",
  15. "rating": 1.7
  16. },
  17. )
  18. print(resp1)
  19. resp2 = client.index(
  20. index="library",
  21. refresh=True,
  22. document={
  23. "title": "Book #3",
  24. "rating": 0.1
  25. },
  26. )
  27. print(resp2)
  28. resp3 = client.search(
  29. filter_path="hits.hits._source",
  30. source="title",
  31. sort="rating:desc",
  32. )
  33. print(resp3)

Ruby

  1. response = client.index(
  2. index: 'library',
  3. refresh: true,
  4. body: {
  5. title: 'Book #1',
  6. rating: 200.1
  7. }
  8. )
  9. puts response
  10. response = client.index(
  11. index: 'library',
  12. refresh: true,
  13. body: {
  14. title: 'Book #2',
  15. rating: 1.7
  16. }
  17. )
  18. puts response
  19. response = client.index(
  20. index: 'library',
  21. refresh: true,
  22. body: {
  23. title: 'Book #3',
  24. rating: 0.1
  25. }
  26. )
  27. puts response
  28. response = client.search(
  29. filter_path: 'hits.hits._source',
  30. _source: 'title',
  31. sort: 'rating:desc'
  32. )
  33. puts response

Go

  1. {
  2. res, err := es.Index(
  3. "library",
  4. strings.NewReader(`{
  5. "title": "Book #1",
  6. "rating": 200.1
  7. }`),
  8. es.Index.WithRefresh("true"),
  9. es.Index.WithPretty(),
  10. )
  11. fmt.Println(res, err)
  12. }
  13. {
  14. res, err := es.Index(
  15. "library",
  16. strings.NewReader(`{
  17. "title": "Book #2",
  18. "rating": 1.7
  19. }`),
  20. es.Index.WithRefresh("true"),
  21. es.Index.WithPretty(),
  22. )
  23. fmt.Println(res, err)
  24. }
  25. {
  26. res, err := es.Index(
  27. "library",
  28. strings.NewReader(`{
  29. "title": "Book #3",
  30. "rating": 0.1
  31. }`),
  32. es.Index.WithRefresh("true"),
  33. es.Index.WithPretty(),
  34. )
  35. fmt.Println(res, err)
  36. }
  37. {
  38. res, err := es.Search(
  39. es.Search.WithSource("title"),
  40. es.Search.WithFilterPath("hits.hits._source"),
  41. es.Search.WithSort("rating:desc"),
  42. es.Search.WithPretty(),
  43. )
  44. fmt.Println(res, err)
  45. }

Js

  1. const response = await client.index({
  2. index: "library",
  3. refresh: "true",
  4. document: {
  5. title: "Book #1",
  6. rating: 200.1,
  7. },
  8. });
  9. console.log(response);
  10. const response1 = await client.index({
  11. index: "library",
  12. refresh: "true",
  13. document: {
  14. title: "Book #2",
  15. rating: 1.7,
  16. },
  17. });
  18. console.log(response1);
  19. const response2 = await client.index({
  20. index: "library",
  21. refresh: "true",
  22. document: {
  23. title: "Book #3",
  24. rating: 0.1,
  25. },
  26. });
  27. console.log(response2);
  28. const response3 = await client.search({
  29. filter_path: "hits.hits._source",
  30. _source: "title",
  31. sort: "rating:desc",
  32. });
  33. console.log(response3);

コンソール

  1. POST /library/_doc?refresh
  2. {"title": "Book #1", "rating": 200.1}
  3. POST /library/_doc?refresh
  4. {"title": "Book #2", "rating": 1.7}
  5. POST /library/_doc?refresh
  6. {"title": "Book #3", "rating": 0.1}
  7. GET /_search?filter_path=hits.hits._source&_source=title&sort=rating:desc

コンソール-結果

  1. {
  2. "hits" : {
  3. "hits" : [ {
  4. "_source":{"title":"Book #1"}
  5. }, {
  6. "_source":{"title":"Book #2"}
  7. }, {
  8. "_source":{"title":"Book #3"}
  9. } ]
  10. }
  11. }

フラット設定

  1. #### Python
  2. ``````python
  3. resp = client.indices.get_settings(
  4. index="my-index-000001",
  5. flat_settings=True,
  6. )
  7. print(resp)
  8. `

Ruby

  1. response = client.indices.get_settings(
  2. index: 'my-index-000001',
  3. flat_settings: true
  4. )
  5. puts response

Js

  1. const response = await client.indices.getSettings({
  2. index: "my-index-000001",
  3. flat_settings: "true",
  4. });
  5. console.log(response);

コンソール

  1. GET my-index-000001/_settings?flat_settings=true

返される:

コンソール-結果

  1. {
  2. "my-index-000001" : {
  3. "settings": {
  4. "index.number_of_replicas": "1",
  5. "index.number_of_shards": "1",
  6. "index.creation_date": "1474389951325",
  7. "index.uuid": "n6gzFZTgS664GUfx0Xrpjw",
  8. "index.version.created": ...,
  9. "index.routing.allocation.include._tier_preference" : "data_content",
  10. "index.provided_name" : "my-index-000001"
  11. }
  12. }
  13. }
  1. #### Python
  2. ``````python
  3. resp = client.indices.get_settings(
  4. index="my-index-000001",
  5. flat_settings=False,
  6. )
  7. print(resp)
  8. `

Ruby

  1. response = client.indices.get_settings(
  2. index: 'my-index-000001',
  3. flat_settings: false
  4. )
  5. puts response

Js

  1. const response = await client.indices.getSettings({
  2. index: "my-index-000001",
  3. flat_settings: "false",
  4. });
  5. console.log(response);

コンソール

  1. GET my-index-000001/_settings?flat_settings=false

返される:

コンソール-結果

  1. {
  2. "my-index-000001" : {
  3. "settings" : {
  4. "index" : {
  5. "number_of_replicas": "1",
  6. "number_of_shards": "1",
  7. "creation_date": "1474389951325",
  8. "uuid": "n6gzFZTgS664GUfx0Xrpjw",
  9. "version": {
  10. "created": ...
  11. },
  12. "routing": {
  13. "allocation": {
  14. "include": {
  15. "_tier_preference": "data_content"
  16. }
  17. }
  18. },
  19. "provided_name" : "my-index-000001"
  20. }
  21. }
  22. }
  23. }

デフォルトではflat_settingsfalseに設定されています。

ファジネス

いくつかのクエリとAPIは、fuzzinessパラメータを使用して不正確なファジーマッチングを許可するパラメータをサポートしています。

  1. `````fuzziness`````パラメータは次のように指定できます:
  2. | | |
  3. | --- | --- |
  4. | `````0`````, `````1`````, `````2````` | 許可される最大レーベンシュタイン編集距離(または編集の数) |
  5. | `````AUTO````` | 用語の長さに基づいて編集距離を生成します。
  6. 低いおよび高い距離引数は、オプションで`````AUTO:[low],[high]`````を提供できます。指定されていない場合、
  7. デフォルト値は36で、長さに対して`````AUTO:3,6`````に相当します:
  8. `````0..2

正確に一致する必要があります

  1. 1つの編集が許可されます
  2. `````>5

2つの編集が許可されます

  1. ## スタックトレースの有効化
  2. デフォルトでは、リクエストがエラーを返すと、Elasticsearchはエラーのスタックトレースを含めません。この動作を有効にするには、`````error_trace````` URLパラメータを`````true`````に設定します。たとえば、デフォルトでは、`````_search````` APIに無効な`````size`````パラメータを送信すると:
  3. #### Python
  4. ``````python
  5. resp = client.search(
  6. index="my-index-000001",
  7. size="surprise_me",
  8. )
  9. print(resp)
  10. `

Js

  1. const response = await client.search({
  2. index: "my-index-000001",
  3. size: "surprise_me",
  4. });
  5. console.log(response);

コンソール

  1. POST /my-index-000001/_search?size=surprise_me

応答は次のようになります:

コンソール-結果

  1. {
  2. "error" : {
  3. "root_cause" : [
  4. {
  5. "type" : "illegal_argument_exception",
  6. "reason" : "Failed to parse int parameter [size] with value [surprise_me]"
  7. }
  8. ],
  9. "type" : "illegal_argument_exception",
  10. "reason" : "Failed to parse int parameter [size] with value [surprise_me]",
  11. "caused_by" : {
  12. "type" : "number_format_exception",
  13. "reason" : "For input string: \"surprise_me\""
  14. }
  15. },
  16. "status" : 400
  17. }

しかし、error_trace=trueを設定すると:

Python

  1. resp = client.search(
  2. index="my-index-000001",
  3. size="surprise_me",
  4. error_trace=True,
  5. )
  6. print(resp)

Js

  1. const response = await client.search({
  2. index: "my-index-000001",
  3. size: "surprise_me",
  4. error_trace: "true",
  5. });
  6. console.log(response);

コンソール

  1. POST /my-index-000001/_search?size=surprise_me&error_trace=true

応答は次のようになります:

コンソール-結果

  1. {
  2. "error": {
  3. "root_cause": [
  4. {
  5. "type": "illegal_argument_exception",
  6. "reason": "Failed to parse int parameter [size] with value [surprise_me]",
  7. "stack_trace": "Failed to parse int parameter [size] with value [surprise_me]]; nested: IllegalArgumentException..."
  8. }
  9. ],
  10. "type": "illegal_argument_exception",
  11. "reason": "Failed to parse int parameter [size] with value [surprise_me]",
  12. "stack_trace": "java.lang.IllegalArgumentException: Failed to parse int parameter [size] with value [surprise_me]\n at org.elasticsearch.rest.RestRequest.paramAsInt(RestRequest.java:175)...",
  13. "caused_by": {
  14. "type": "number_format_exception",
  15. "reason": "For input string: \"surprise_me\"",
  16. "stack_trace": "java.lang.NumberFormatException: For input string: \"surprise_me\"\n at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)..."
  17. }
  18. },
  19. "status": 400
  20. }