目录:
在使用正常查询时,如下:
GET people/user/_search?q=age:27
会返回查询结果
{
"took": 0,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "people",
"_type": "user",
"_id": "4",
"_score": 1,
"_source": {
"id": 4,
"name": "jack ma",
"age": 27,
"address": "宁波",
"interests": [
"bastkeyball",
"football"
],
"create_time": "2018-02-04"
}
}
]
}
}
使用验证查询时:
GET user/_validate/query?q=create_time:aa
会返回:
{
"valid": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
}
}
由此我们可以知道,验证查询的作用是:可以在不执行查询的前提下,先验证下这个查询语句是否合法。比如上面这个,create_time是个时间,时间是不能和aa类匹配的,所以,返回的valid标识为false。
我们查询一下为什么不合法
GET user/_validate/query?q=create_time:aa&explain=true
解释结果如下:
{
"valid": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"explanations": [
{
"index": "user",
"valid": false,
"error": """
[user/eQMgyyMyRaanpI83hH2jeA] QueryShardException[failed to create query: {
"query_string" : {
"query" : "create_time:aa",
"fields" : [ ],
"use_dis_max" : true,
"tie_breaker" : 0.0,
"default_operator" : "or",
"auto_generate_phrase_queries" : false,
"max_determinized_states" : 10000,
"enable_position_increments" : true,
"fuzziness" : "AUTO",
"fuzzy_prefix_length" : 0,
"fuzzy_max_expansions" : 50,
"phrase_slop" : 0,
"analyze_wildcard" : false,
"escape" : false,
"split_on_whitespace" : true,
"boost" : 1.0
}
}]; nested: ElasticsearchParseException[failed to parse date field [aa] with format [strict_date_optional_time||epoch_millis]]; nested: IllegalArgumentException[Parse failure at index [0] of [aa]];; ElasticsearchParseException[failed to parse date field [aa] with format [strict_date_optional_time||epoch_millis]]; nested: IllegalArgumentException[Parse failure at index [0] of [aa]];; java.lang.IllegalArgumentException: Parse failure at index [0] of [aa]
"""
}
]
}
在explanations中,详细的告诉了我们为什么这个查询语句不合法。
而在合法的查询语句中,explain可以解释这个语句是如何操作的,便于我们了解如何执行这条语句。
GET user/_validate/query?explain=true
{
"query": {
"match": {
"age": "27"
}
}
}
返回后:
{
"valid": true,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"explanations": [
{
"index": "user",
"valid": true,
"explanation": "age:[27 TO 27]"
}
]
}
如果我们将重写rewrite设置为true,将更详细地显示将要执行的实际Lucene查询。
GET user/_validate/query?rewrite=true
{
"query": {
"match": {
"create_time": "2014-02-15"
}
}
}
返回为:
{
"valid": true,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"explanations": [
{
"index": "user",
"valid": true,
"explanation": "create_time:[1392422400000 TO 1392508799999]"
}
]
}