验证查询(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

posted @ 2014-06-09 14:35  QQ1350995917  Views(456)  Comments(0)    收藏  举报