一般的なオプション
すべての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
| 秒 |
now
が2001-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
resp = client.search(
q="kimchy",
filter_path="took,hits.hits._id,hits.hits._score",
)
print(resp)
Ruby
response = client.search(
q: 'kimchy',
filter_path: 'took,hits.hits._id,hits.hits._score'
)
puts response
Js
const response = await client.search({
q: "kimchy",
filter_path: "took,hits.hits._id,hits.hits._score",
});
console.log(response);
コンソール
GET /_search?q=kimchy&filter_path=took,hits.hits._id,hits.hits._score
コンソール-結果
{
"took" : 3,
"hits" : {
"hits" : [
{
"_id" : "0",
"_score" : 1.6375021
}
]
}
}
また、*
ワイルドカード文字を使用して、フィールドまたはフィールド名の一部に一致させることができます:
Php
$response = $client->cluster()->state();
Python
resp = client.cluster.state(
filter_path="metadata.indices.*.stat*",
)
print(resp)
Ruby
response = client.cluster.state(
filter_path: 'metadata.indices.*.stat*'
)
puts response
Go
res, err := es.Cluster.State(
es.Cluster.State.WithFilterPath("metadata.indices.*.stat*"),
)
fmt.Println(res, err)
Js
const response = await client.cluster.state({
filter_path: "metadata.indices.*.stat*",
});
console.log(response);
コンソール
GET /_cluster/state?filter_path=metadata.indices.*.stat*
コンソール-結果
{
"metadata" : {
"indices" : {
"my-index-000001": {"state": "open"}
}
}
}
#### Php
``````php
$response = $client->cluster()->state();
`
Python
resp = client.cluster.state(
filter_path="routing_table.indices.**.state",
)
print(resp)
Ruby
response = client.cluster.state(
filter_path: 'routing_table.indices.**.state'
)
puts response
Go
res, err := es.Cluster.State(
es.Cluster.State.WithFilterPath("routing_table.indices.**.state"),
)
fmt.Println(res, err)
Js
const response = await client.cluster.state({
filter_path: "routing_table.indices.**.state",
});
console.log(response);
コンソール
GET /_cluster/state?filter_path=routing_table.indices.**.state
コンソール-結果
{
"routing_table": {
"indices": {
"my-index-000001": {
"shards": {
"0": [{"state": "STARTED"}, {"state": "UNASSIGNED"}]
}
}
}
}
}
フィルタの前に-
文字を付けることで、1つ以上のフィールドを除外することも可能です:
Php
$response = $client->count();
Python
resp = client.count(
filter_path="-_shards",
)
print(resp)
Ruby
response = client.count(
filter_path: '-_shards'
)
puts response
Go
res, err := es.Count(
es.Count.WithFilterPath("-_shards"),
es.Count.WithPretty(),
)
fmt.Println(res, err)
Js
const response = await client.count({
filter_path: "-_shards",
});
console.log(response);
コンソール
GET /_count?filter_path=-_shards
コンソール-結果
{
"count" : 5
}
より多くの制御のために、包括的および排他的フィルタを同じ式で組み合わせることができます。この場合、排他的フィルタが最初に適用され、結果は再度包括的フィルタを使用してフィルタリングされます:
Php
$response = $client->cluster()->state();
Python
resp = client.cluster.state(
filter_path="metadata.indices.*.state,-metadata.indices.logstash-*",
)
print(resp)
Ruby
response = client.cluster.state(
filter_path: 'metadata.indices.*.state,-metadata.indices.logstash-*'
)
puts response
Go
res, err := es.Cluster.State(
es.Cluster.State.WithFilterPath("metadata.indices.*.state,-metadata.indices.logstash-*"),
)
fmt.Println(res, err)
Js
const response = await client.cluster.state({
filter_path: "metadata.indices.*.state,-metadata.indices.logstash-*",
});
console.log(response);
コンソール
GET /_cluster/state?filter_path=metadata.indices.*.state,-metadata.indices.logstash-*
コンソール-結果
{
"metadata" : {
"indices" : {
"my-index-000001" : {"state" : "open"},
"my-index-000002" : {"state" : "open"},
"my-index-000003" : {"state" : "open"}
}
}
}
Elasticsearchは時々、_source
フィールドの生の値を直接返すことに注意してください。_source
フィールドをフィルタリングしたい場合は、既存の_source
パラメータ(詳細はGet APIを参照)をfilter_path
パラメータと組み合わせることを検討してください。このように:
Php
$params = [
'index' => 'library',
'body' => [
'title' => 'Book #1',
'rating' => 200.1,
],
];
$response = $client->index($params);
$params = [
'index' => 'library',
'body' => [
'title' => 'Book #2',
'rating' => 1.7,
],
];
$response = $client->index($params);
$params = [
'index' => 'library',
'body' => [
'title' => 'Book #3',
'rating' => 0.1,
],
];
$response = $client->index($params);
$response = $client->search();
Python
resp = client.index(
index="library",
refresh=True,
document={
"title": "Book #1",
"rating": 200.1
},
)
print(resp)
resp1 = client.index(
index="library",
refresh=True,
document={
"title": "Book #2",
"rating": 1.7
},
)
print(resp1)
resp2 = client.index(
index="library",
refresh=True,
document={
"title": "Book #3",
"rating": 0.1
},
)
print(resp2)
resp3 = client.search(
filter_path="hits.hits._source",
source="title",
sort="rating:desc",
)
print(resp3)
Ruby
response = client.index(
index: 'library',
refresh: true,
body: {
title: 'Book #1',
rating: 200.1
}
)
puts response
response = client.index(
index: 'library',
refresh: true,
body: {
title: 'Book #2',
rating: 1.7
}
)
puts response
response = client.index(
index: 'library',
refresh: true,
body: {
title: 'Book #3',
rating: 0.1
}
)
puts response
response = client.search(
filter_path: 'hits.hits._source',
_source: 'title',
sort: 'rating:desc'
)
puts response
Go
{
res, err := es.Index(
"library",
strings.NewReader(`{
"title": "Book #1",
"rating": 200.1
}`),
es.Index.WithRefresh("true"),
es.Index.WithPretty(),
)
fmt.Println(res, err)
}
{
res, err := es.Index(
"library",
strings.NewReader(`{
"title": "Book #2",
"rating": 1.7
}`),
es.Index.WithRefresh("true"),
es.Index.WithPretty(),
)
fmt.Println(res, err)
}
{
res, err := es.Index(
"library",
strings.NewReader(`{
"title": "Book #3",
"rating": 0.1
}`),
es.Index.WithRefresh("true"),
es.Index.WithPretty(),
)
fmt.Println(res, err)
}
{
res, err := es.Search(
es.Search.WithSource("title"),
es.Search.WithFilterPath("hits.hits._source"),
es.Search.WithSort("rating:desc"),
es.Search.WithPretty(),
)
fmt.Println(res, err)
}
Js
const response = await client.index({
index: "library",
refresh: "true",
document: {
title: "Book #1",
rating: 200.1,
},
});
console.log(response);
const response1 = await client.index({
index: "library",
refresh: "true",
document: {
title: "Book #2",
rating: 1.7,
},
});
console.log(response1);
const response2 = await client.index({
index: "library",
refresh: "true",
document: {
title: "Book #3",
rating: 0.1,
},
});
console.log(response2);
const response3 = await client.search({
filter_path: "hits.hits._source",
_source: "title",
sort: "rating:desc",
});
console.log(response3);
コンソール
POST /library/_doc?refresh
{"title": "Book #1", "rating": 200.1}
POST /library/_doc?refresh
{"title": "Book #2", "rating": 1.7}
POST /library/_doc?refresh
{"title": "Book #3", "rating": 0.1}
GET /_search?filter_path=hits.hits._source&_source=title&sort=rating:desc
コンソール-結果
{
"hits" : {
"hits" : [ {
"_source":{"title":"Book #1"}
}, {
"_source":{"title":"Book #2"}
}, {
"_source":{"title":"Book #3"}
} ]
}
}
フラット設定
#### Python
``````python
resp = client.indices.get_settings(
index="my-index-000001",
flat_settings=True,
)
print(resp)
`
Ruby
response = client.indices.get_settings(
index: 'my-index-000001',
flat_settings: true
)
puts response
Js
const response = await client.indices.getSettings({
index: "my-index-000001",
flat_settings: "true",
});
console.log(response);
コンソール
GET my-index-000001/_settings?flat_settings=true
コンソール-結果
{
"my-index-000001" : {
"settings": {
"index.number_of_replicas": "1",
"index.number_of_shards": "1",
"index.creation_date": "1474389951325",
"index.uuid": "n6gzFZTgS664GUfx0Xrpjw",
"index.version.created": ...,
"index.routing.allocation.include._tier_preference" : "data_content",
"index.provided_name" : "my-index-000001"
}
}
}
#### Python
``````python
resp = client.indices.get_settings(
index="my-index-000001",
flat_settings=False,
)
print(resp)
`
Ruby
response = client.indices.get_settings(
index: 'my-index-000001',
flat_settings: false
)
puts response
Js
const response = await client.indices.getSettings({
index: "my-index-000001",
flat_settings: "false",
});
console.log(response);
コンソール
GET my-index-000001/_settings?flat_settings=false
コンソール-結果
{
"my-index-000001" : {
"settings" : {
"index" : {
"number_of_replicas": "1",
"number_of_shards": "1",
"creation_date": "1474389951325",
"uuid": "n6gzFZTgS664GUfx0Xrpjw",
"version": {
"created": ...
},
"routing": {
"allocation": {
"include": {
"_tier_preference": "data_content"
}
}
},
"provided_name" : "my-index-000001"
}
}
}
}
デフォルトではflat_settings
はfalse
に設定されています。
ファジネス
いくつかのクエリとAPIは、fuzziness
パラメータを使用して不正確なファジーマッチングを許可するパラメータをサポートしています。
`````fuzziness`````パラメータは次のように指定できます:
| | |
| --- | --- |
| `````0`````, `````1`````, `````2````` | 許可される最大レーベンシュタイン編集距離(または編集の数) |
| `````AUTO````` | 用語の長さに基づいて編集距離を生成します。
低いおよび高い距離引数は、オプションで`````AUTO:[low],[high]`````を提供できます。指定されていない場合、
デフォルト値は3と6で、長さに対して`````AUTO:3,6`````に相当します:
`````0..2
正確に一致する必要があります
1つの編集が許可されます
`````>5
2つの編集が許可されます
## スタックトレースの有効化
デフォルトでは、リクエストがエラーを返すと、Elasticsearchはエラーのスタックトレースを含めません。この動作を有効にするには、`````error_trace````` URLパラメータを`````true`````に設定します。たとえば、デフォルトでは、`````_search````` APIに無効な`````size`````パラメータを送信すると:
#### Python
``````python
resp = client.search(
index="my-index-000001",
size="surprise_me",
)
print(resp)
`
Js
const response = await client.search({
index: "my-index-000001",
size: "surprise_me",
});
console.log(response);
コンソール
POST /my-index-000001/_search?size=surprise_me
コンソール-結果
{
"error" : {
"root_cause" : [
{
"type" : "illegal_argument_exception",
"reason" : "Failed to parse int parameter [size] with value [surprise_me]"
}
],
"type" : "illegal_argument_exception",
"reason" : "Failed to parse int parameter [size] with value [surprise_me]",
"caused_by" : {
"type" : "number_format_exception",
"reason" : "For input string: \"surprise_me\""
}
},
"status" : 400
}
しかし、error_trace=true
を設定すると:
Python
resp = client.search(
index="my-index-000001",
size="surprise_me",
error_trace=True,
)
print(resp)
Js
const response = await client.search({
index: "my-index-000001",
size: "surprise_me",
error_trace: "true",
});
console.log(response);
コンソール
POST /my-index-000001/_search?size=surprise_me&error_trace=true
コンソール-結果
{
"error": {
"root_cause": [
{
"type": "illegal_argument_exception",
"reason": "Failed to parse int parameter [size] with value [surprise_me]",
"stack_trace": "Failed to parse int parameter [size] with value [surprise_me]]; nested: IllegalArgumentException..."
}
],
"type": "illegal_argument_exception",
"reason": "Failed to parse int parameter [size] with value [surprise_me]",
"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)...",
"caused_by": {
"type": "number_format_exception",
"reason": "For input string: \"surprise_me\"",
"stack_trace": "java.lang.NumberFormatException: For input string: \"surprise_me\"\n at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)..."
}
},
"status": 400
}