Validate API
クエリを実行せずに、潜在的に高コストなクエリを検証します。
Python
resp = client.indices.validate_query(
index="my-index-000001",
q="user.id:kimchy",
)
print(resp)
Ruby
response = client.indices.validate_query(
index: 'my-index-000001',
q: 'user.id:kimchy'
)
puts response
Js
const response = await client.indices.validateQuery({
index: "my-index-000001",
q: "user.id:kimchy",
});
console.log(response);
Console
GET my-index-000001/_validate/query?q=user.id:kimchy
Request
GET /<target>/_validate/<query>
Prerequisites
- Elasticsearchのセキュリティ機能が有効になっている場合、ターゲットデータストリーム、インデックス、またはエイリアスに対して、
read
インデックス権限を持っている必要があります。
Description
validate APIを使用すると、クエリを実行せずに潜在的に高コストなクエリを検証できます。クエリは、パスパラメータまたはリクエストボディのいずれかとして送信できます。
Path parameters
<target>
- (オプション、文字列)検索するデータストリーム、インデックス、およびエイリアスのカンマ区切りリスト。ワイルドカード(
*
)をサポートします。すべてのデータストリームまたはインデックスを検索するには、このパラメータを省略するか、*
または_all
を使用します。 query
- (オプション、クエリオブジェクト)Query DSLを使用して検索定義を定義します。
Query parameters
all_shards
- (オプション、ブール値)
true
の場合、検証はインデックスごとに1つのランダムなシャードではなく、すべてのシャードで実行されます。デフォルトはfalse
です。 allow_no_indices
- (オプション、ブール値)
false
の場合、リクエストは、ワイルドカード式、インデックスエイリアス、または_all
値が欠落または閉じたインデックスのみをターゲットにする場合にエラーを返します。この動作は、リクエストが他のオープンインデックスをターゲットにしている場合でも適用されます。たとえば、foo*,bar*
をターゲットにするリクエストは、foo
で始まるインデックスがあるが、bar
で始まるインデックスがない場合にエラーを返します。
デフォルトはfalse
です。 analyzer
- (オプション、文字列)クエリ文字列に使用するアナライザー。
このパラメータは、q
クエリ文字列パラメータが指定されている場合にのみ使用できます。 analyze_wildcard
- (オプション、ブール値)
true
の場合、ワイルドカードおよびプレフィックスクエリが分析されます。デフォルトはfalse
です。
このパラメータは、q
クエリ文字列パラメータが指定されている場合にのみ使用できます。 default_operator
- (オプション、文字列)クエリ文字列クエリのデフォルト演算子:ANDまたはOR。デフォルトは
OR
です。
このパラメータは、q
クエリ文字列パラメータが指定されている場合にのみ使用できます。 df
- (オプション、文字列)クエリ文字列にフィールドプレフィックスが指定されていない場合にデフォルトとして使用するフィールド。
このパラメータは、q
クエリ文字列パラメータが指定されている場合にのみ使用できます。 expand_wildcards
- (オプション、文字列)ワイルドカードパターンが一致できるインデックスのタイプ。リクエストがデータストリームをターゲットにできる場合、この引数はワイルドカード式が隠れたデータストリームに一致するかどうかを決定します。カンマ区切りの値(
open,hidden
など)をサポートします。有効な値は:all
- すべてのデータストリームまたはインデックスに一致し、隠れたものも含まれます。
open
- オープンで非隠れたインデックスに一致します。また、非隠れたデータストリームにも一致します。
closed
- クローズドで非隠れたインデックスに一致します。また、非隠れたデータストリームにも一致します。データストリームはクローズできません。
hidden
- 隠れたデータストリームおよび隠れたインデックスに一致します。
open
、closed
、またはその両方と組み合わせる必要があります。 none
- ワイルドカードパターンは受け付けられません。
explain
- (オプション、ブール値)
true
の場合、エラーが発生した場合に詳細情報が返されます。デフォルトはfalse
です。 ignore_unavailable
- (オプション、ブール値)
false
の場合、欠落またはクローズされたインデックスをターゲットにする場合、リクエストはエラーを返します。デフォルトはfalse
です。 lenient
- (オプション、ブール値)
true
の場合、クエリ文字列内の形式ベースのクエリ失敗(数値フィールドにテキストを提供するなど)は無視されます。デフォルトはfalse
です。
このパラメータは、q
クエリ文字列パラメータが指定されている場合にのみ使用できます。 rewrite
- (オプション、ブール値)
true
の場合、実行される実際のLuceneクエリを示すより詳細な説明が返されます。デフォルトはfalse
です。 q
- (オプション、文字列)Luceneクエリ文字列構文のクエリ。
Examples
Python
resp = client.bulk(
index="my-index-000001",
refresh=True,
operations=[
{
"index": {
"_id": 1
}
},
{
"user": {
"id": "kimchy"
},
"@timestamp": "2099-11-15T14:12:12",
"message": "trying out Elasticsearch"
},
{
"index": {
"_id": 2
}
},
{
"user": {
"id": "kimchi"
},
"@timestamp": "2099-11-15T14:12:13",
"message": "My user ID is similar to kimchy!"
}
],
)
print(resp)
Ruby
response = client.bulk(
index: 'my-index-000001',
refresh: true,
body: [
{
index: {
_id: 1
}
},
{
user: {
id: 'kimchy'
},
"@timestamp": '2099-11-15T14:12:12',
message: 'trying out Elasticsearch'
},
{
index: {
_id: 2
}
},
{
user: {
id: 'kimchi'
},
"@timestamp": '2099-11-15T14:12:13',
message: 'My user ID is similar to kimchy!'
}
]
)
puts response
Js
const response = await client.bulk({
index: "my-index-000001",
refresh: "true",
operations: [
{
index: {
_id: 1,
},
},
{
user: {
id: "kimchy",
},
"@timestamp": "2099-11-15T14:12:12",
message: "trying out Elasticsearch",
},
{
index: {
_id: 2,
},
},
{
user: {
id: "kimchi",
},
"@timestamp": "2099-11-15T14:12:13",
message: "My user ID is similar to kimchy!",
},
],
});
console.log(response);
Console
PUT my-index-000001/_bulk?refresh
{"index":{"_id":1}}
{"user" : { "id": "kimchy" }, "@timestamp" : "2099-11-15T14:12:12", "message" : "trying out Elasticsearch"}
{"index":{"_id":2}}
{"user" : { "id": "kimchi" }, "@timestamp" : "2099-11-15T14:12:13", "message" : "My user ID is similar to kimchy!"}
有効なクエリが送信された場合:
Python
resp = client.indices.validate_query(
index="my-index-000001",
q="user.id:kimchy",
)
print(resp)
Ruby
response = client.indices.validate_query(
index: 'my-index-000001',
q: 'user.id:kimchy'
)
puts response
Js
const response = await client.indices.validateQuery({
index: "my-index-000001",
q: "user.id:kimchy",
});
console.log(response);
Console
GET my-index-000001/_validate/query?q=user.id:kimchy
Console-Result
{"valid":true,"_shards":{"total":1,"successful":1,"failed":0}}
クエリはリクエストボディ内でも送信できます:
Python
resp = client.indices.validate_query(
index="my-index-000001",
query={
"bool": {
"must": {
"query_string": {
"query": "*:*"
}
},
"filter": {
"term": {
"user.id": "kimchy"
}
}
}
},
)
print(resp)
Ruby
response = client.indices.validate_query(
index: 'my-index-000001',
body: {
query: {
bool: {
must: {
query_string: {
query: '*:*'
}
},
filter: {
term: {
'user.id' => 'kimchy'
}
}
}
}
}
)
puts response
Js
const response = await client.indices.validateQuery({
index: "my-index-000001",
query: {
bool: {
must: {
query_string: {
query: "*:*",
},
},
filter: {
term: {
"user.id": "kimchy",
},
},
},
},
});
console.log(response);
Console
GET my-index-000001/_validate/query
{
"query" : {
"bool" : {
"must" : {
"query_string" : {
"query" : "*:*"
}
},
"filter" : {
"term" : { "user.id" : "kimchy" }
}
}
}
}
ボディ内で送信されるクエリは、query
キー内にネストされている必要があります。これはsearch apiと同様に機能します。
クエリが無効な場合、valid
はfalse
になります。ここで、クエリが無効である理由は、Elasticsearchがpost_date
フィールドが動的マッピングにより日付であるべきだと知っているためであり、fooは日付として正しく解析されません:
Python
resp = client.indices.validate_query(
index="my-index-000001",
query={
"query_string": {
"query": "@timestamp:foo",
"lenient": False
}
},
)
print(resp)
Ruby
response = client.indices.validate_query(
index: 'my-index-000001',
body: {
query: {
query_string: {
query: '@timestamp:foo',
lenient: false
}
}
}
)
puts response
Js
const response = await client.indices.validateQuery({
index: "my-index-000001",
query: {
query_string: {
query: "@timestamp:foo",
lenient: false,
},
},
});
console.log(response);
Console
GET my-index-000001/_validate/query
{
"query": {
"query_string": {
"query": "@timestamp:foo",
"lenient": false
}
}
}
Console-Result
{"valid":false,"_shards":{"total":1,"successful":1,"failed":0}}
The explain parameter
#### Python
``````python
resp = client.indices.validate_query(
index="my-index-000001",
explain=True,
query={
"query_string": {
"query": "@timestamp:foo",
"lenient": False
}
},
)
print(resp)
`
Ruby
response = client.indices.validate_query(
index: 'my-index-000001',
explain: true,
body: {
query: {
query_string: {
query: '@timestamp:foo',
lenient: false
}
}
}
)
puts response
Js
const response = await client.indices.validateQuery({
index: "my-index-000001",
explain: "true",
query: {
query_string: {
query: "@timestamp:foo",
lenient: false,
},
},
});
console.log(response);
Console
GET my-index-000001/_validate/query?explain=true
{
"query": {
"query_string": {
"query": "@timestamp:foo",
"lenient": false
}
}
}
Console-Result
{
"valid" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"failed" : 0
},
"explanations" : [ {
"index" : "my-index-000001",
"valid" : false,
"error" : "my-index-000001/IAEc2nIXSSunQA_suI0MLw] QueryShardException[failed to create query:...failed to parse date field [foo]"
} ]
}
The rewrite parameter
クエリが有効な場合、説明はそのクエリの文字列表現にデフォルト設定されます。rewrite
がtrue
に設定されている場合、説明は実行される実際のLuceneクエリを示すより詳細なものになります。
Python
resp = client.indices.validate_query(
index="my-index-000001",
rewrite=True,
query={
"more_like_this": {
"like": {
"_id": "2"
},
"boost_terms": 1
}
},
)
print(resp)
Ruby
response = client.indices.validate_query(
index: 'my-index-000001',
rewrite: true,
body: {
query: {
more_like_this: {
like: {
_id: '2'
},
boost_terms: 1
}
}
}
)
puts response
Js
const response = await client.indices.validateQuery({
index: "my-index-000001",
rewrite: "true",
query: {
more_like_this: {
like: {
_id: "2",
},
boost_terms: 1,
},
},
});
console.log(response);
Console
GET my-index-000001/_validate/query?rewrite=true
{
"query": {
"more_like_this": {
"like": {
"_id": "2"
},
"boost_terms": 1
}
}
}
Console-Result
{
"valid": true,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"explanations": [
{
"index": "my-index-000001",
"valid": true,
"explanation": "((user:terminator^3.71334 plot:future^2.763601 plot:human^2.8415773 plot:sarah^3.4193945 plot:kyle^3.8244398 plot:cyborg^3.9177752 plot:connor^4.040236 plot:reese^4.7133346 ... )~6) -ConstantScore(_id:2)) #(ConstantScore(_type:_doc))^0.0"
}
]
}
Rewrite and all_shards parameters
デフォルトでは、リクエストはランダムに選択された単一のシャードで実行されます。クエリの詳細な説明は、どのシャードがヒットしているかによって異なる場合があり、リクエストごとに異なる可能性があります。したがって、クエリの書き換えの場合、all_shards
パラメータを使用して、すべての利用可能なシャードからのレスポンスを取得する必要があります。
Python
resp = client.indices.validate_query(
index="my-index-000001",
rewrite=True,
all_shards=True,
query={
"match": {
"user.id": {
"query": "kimchy",
"fuzziness": "auto"
}
}
},
)
print(resp)
Ruby
response = client.indices.validate_query(
index: 'my-index-000001',
rewrite: true,
all_shards: true,
body: {
query: {
match: {
'user.id' => {
query: 'kimchy',
fuzziness: 'auto'
}
}
}
}
)
puts response
Js
const response = await client.indices.validateQuery({
index: "my-index-000001",
rewrite: "true",
all_shards: "true",
query: {
match: {
"user.id": {
query: "kimchy",
fuzziness: "auto",
},
},
},
});
console.log(response);
Console
GET my-index-000001/_validate/query?rewrite=true&all_shards=true
{
"query": {
"match": {
"user.id": {
"query": "kimchy",
"fuzziness": "auto"
}
}
}
}
Console-Result
{
"valid": true,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"explanations": [
{
"index": "my-index-000001",
"shard": 0,
"valid": true,
"explanation": "(user.id:kimchi)^0.8333333 user.id:kimchy"
}
]
}