Elasticsearch 验证查询

验证查询

  • 查询语句可以变得非常复杂,特别是与不同的分析器和字段映射相结合后,就会有些难度。
  • validate API 可以验证一条查询语句是否合法。
    GET /gb/tweet/_validate/query
    {
       "query": {
          "tweet" : {
             "match" : "really powerful"
          }
       }
    }
    
  • 以上请求的返回值告诉我们这条语句是非法的:
    {
      "valid" :         false,
      "_shards" : {
        "total" :       1,
        "successful" :  1,
        "failed" :      0
      }
    }
    

理解错误信息

  • 想知道语句非法的具体错误信息,需要加上 explain 参数:
    GET /gb/tweet/_validate/query?explain <1>
    {
       "query": {
          "tweet" : {
             "match" : "really powerful"
          }
       }
    }
    
  • <1> explain 参数可以提供语句错误的更多详情。
  • 很显然,我们把 query 语句的 match 与字段名位置弄反了:
    {
      "valid" :     false,
      "_shards" :   { ... },
      "explanations" : [ {
        "index" :   "gb",
        "valid" :   false,
        "error" :   "org.elasticsearch.index.query.QueryParsingException:
                     [gb] No query registered for [tweet]"
      } ]
    }
    

理解查询语句

  • 如果是合法语句的话,使用 explain 参数可以返回一个带有查询语句的可阅读描述, 可以帮助了解查询语句在ES中是如何执行的:
    GET /_validate/query?explain
    {
       "query": {
          "match" : {
             "tweet" : "really powerful"
          }
       }
    }
    
  • explanation 会为每一个索引返回一段描述,因为每个索引会有不同的映射关系和分析器:
    {
      "valid" :         true,
      "_shards" :       { ... },
      "explanations" : [ {
        "index" :       "us",
        "valid" :       true,
        "explanation" : "tweet:really tweet:powerful"
      }, {
        "index" :       "gb",
        "valid" :       true,
        "explanation" : "tweet:really tweet:power"
      } ]
    }
    
  • 从返回的 explanation 你会看到 match 是如何为查询字符串 "really powerful" 进行查询的, 首先,它被拆分成两个独立的词分别在 tweet 字段中进行查询。
  • 而且,在索引us中这两个词为"really""powerful",在索引gb中被拆分成"really""power"。 这是因为我们在索引gb中使用了english分析器。

结语

这一章详细介绍了如何在项目中使用常见的查询语句。也就是说,想要完全掌握搜索和结构化查询,还需要在工作中花费大量的时间来理解ES的工作方式。更高级的部分,我们将会在《深入搜索》中详细讲解,但是在讲解之前,你还需要理解查询结果是如何进行排序的。下一章我们将学习如何根据相关性对查询结果进行排序以及指定排序过程。