验证查询(validating queries)
查询也可以变得相当的复杂,特别是和不同的analyzer和field mapping联合的时候,就会变得难以理解,以及语句的正确性。ES提供了validate API帮助检测一个query是否是正确的:
GET /gb/tweet/_validate/query
{
"query":{
"tweet":{
"match":"really powerful"
}
}
}
下面的相应答复了上面的验证,表明这个query是错误的;
{
"valid": false,
"_shards":{
"total": 1,
"successful": 1,
"failed": 0
}
}
understanding errors
为了发现错误的地方,可以给URL加上exoplain参数:
GET /gb/tweet/_validate/query?explain
{
"query":{
"tweet":{
"match":"really powerful"
}
}
}
标记1出表示explain标签提供了更多的关于错误的信息。
一下的信息明显的表示我们混淆使用了字段名称(tweet)代替了query type(match):
{
"valid": false,
"_shards": {...},
"explanations":[{
"index": "gb",
"valid": false,
"error": "org.elasticsearch.index.query.QueryParsingException:
[gb]No query registered for[tweet]"
}]
}
understanding queries
使用explain参数已经返回了可读的验证信息的描述,这些对确切的理解ES为什么终止了你的查询是十分有用的。
GET /_validate/query?explain
{
"query":{
"match":{
"tweet":"really powerful"
}
}
}
一个explanation会返回每一个index的验证信息,因为每一个index都有不同的mapping和analyzer;
{
"valid": true,
"_shards": {...},
"explanations":[{
"index": "us",
"valid": true,
"explanation":"tweet:really tweet:powerful"
},{
"index": "gb",
"valid": true,
"explanation":"tweet:realli tweet:power"
}]
}
从explanation中可以看出”really powerful“查询字符串的match查询,已经重写为每个单词的单独针对tweet字段的查询。
对us index也是如此,”really powerful“被拆分为”really“和”powerfull“,而对于gb index,条目就是”realli“和”power“,这个原因是我们修改了gb的tweet的analyzer为english。
原文:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/_validating_queries.html

浙公网安备 33010602011771号