Elasticsearch _validate API无法解决_search API允许的查询

时间:2014-06-27 18:37:11

标签: elasticsearch

我正在尝试使用_validate API,它拒绝将无效查询作为发送到_search API时提交的确切正文。 _validate请求体是否需要以某种方式有所不同?

对于“解释”结果,我得到的结论是“没有为[字段]注册查询"。删除返回字段列表,它抱怨过滤器。

以下是一个例子:

curl -s -XGET 'http://localhost:9200/4af9aae4-7ec1-458d-8c50-692ddb0f2c6d/msg,file,file-info/_validate/query?explain=true' -d '{"fields":["id"],"filter":{"not":{"and":[{"numeric_range":{"msg-size":{"gte":1000}}},{"query":{"prefix":{"content-type.verbatim":"application/"}}}]}}}' | python -mjson.tool
{
    "_shards": {
        "failed": 0, 
        "successful": 1, 
        "total": 1
    }, 
    "explanations": [
        {
            "error": "org.elasticsearch.index.query.QueryParsingException: [4af9aae4-7ec1-458d-8c50-692ddb0f2c6d-0] request does not support [fields]", 
            "index": "4af9aae4-7ec1-458d-8c50-692ddb0f2c6d-0", 
            "valid": false
        }
    ], 
    "valid": false
}

删除字段,报告查询不支持过​​滤器

curl -s -XGET 'http://localhost:9200/4af9aae4-7ec1-458d-8c50-692ddb0f2c6d/msg,file,file-info/_validate/query?explain=true' -d '{"filter":{"not":{"and":[{"numeric_range":{"msg-size":{"gte":1000}}},{"query":{"prefix":{"content-type.verbatim":"application/"}}}]}}}' | python -mjson.tool
{
    "_shards": {
        "failed": 0, 
        "successful": 1, 
        "total": 1
    }, 
    "explanations": [
        {
            "error": "org.elasticsearch.index.query.QueryParsingException: [4af9aae4-7ec1-458d-8c50-692ddb0f2c6d-0] request does not support [filter]", 
            "index": "4af9aae4-7ec1-458d-8c50-692ddb0f2c6d-0", 
            "valid": false
        }
    ], 
    "valid": false
}

有些查询可以使用验证API,因此它不是一个全面的失败。

curl -s -XGET 'http://localhost:9200/4af9aae4-7ec1-458d-8c50-692ddb0f2c6d/msg,file,file-info/_validate/query?explain=true' -d '{"query": { "match": { "file-name": "PLEASE READ: something not important" }}}' | python -mjson.tool
{                                                                                                                                                                                                                                             
    "_shards": {                                                                                                                                                                                                                              
        "failed": 0,                                                                                                                                                                                                                          
        "successful": 1,                                                                                                                                                                                                                      
        "total": 1                                                                                                                                                                                                                            
    },                                                                                                                                                                                                                                        
    "explanations": [                                                                                                                                                                                                                         
        {                                                                                                                                                                                                                                     
            "explanation": "filtered(file-name:PLEASE READ: something not important)->cache(_type:file _type:file-info _type:msg)",                                                                                                       
            "index": "4af9aae4-7ec1-458d-8c50-692ddb0f2c6d-0",                                                                                                                                                                                
            "valid": true                                                                                                                                                                                                                     
        }                                                                                                                                                                                                                                     
    ],                                                                                                                                                                                                                                        
    "valid": true                                                                                                                                                                                                                             
}  

我的理解是_validate运行与实际执行查询时相同的语法检查等,所以我不确定发生了什么。

其他细节:

Elasticsearch v 1.2.1 Ubuntu Linux Precise 64

1 个答案:

答案 0 :(得分:2)

您需要将查询包装在查询键中以使用_validate端点 - 这就是为什么您的上一个示例有效,但前两个示例没有。

  

请注意

     

正文中发送的查询必须嵌套在查询键中,同样   搜索API工作[1.0.0.RC1]在1.0.0.RC1中添加。查询是   以前是顶级对象..

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-validate.html