验证查询

查询语句可以变得非常复杂,特别是与不同的分析器和字段映射相结合后,就会有些难度。

validate API 可以验证一条查询语句是否合法。

  1. GET /gb/tweet/_validate/query
  2. {
  3. "query": {
  4. "tweet" : {
  5. "match" : "really powerful"
  6. }
  7. }
  8. }

以上请求的返回值告诉我们这条语句是非法的:

  1. {
  2. "valid" : false,
  3. "_shards" : {
  4. "total" : 1,
  5. "successful" : 1,
  6. "failed" : 0
  7. }
  8. }

理解错误信息

想知道语句非法的具体错误信息,需要加上 explain 参数:

  1. GET /gb/tweet/_validate/query?explain <1>
  2. {
  3. "query": {
  4. "tweet" : {
  5. "match" : "really powerful"
  6. }
  7. }
  8. }

<1> explain 参数可以提供语句错误的更多详情。

很显然,我们把 query 语句的 match 与字段名位置弄反了:

  1. {
  2. "valid" : false,
  3. "_shards" : { ... },
  4. "explanations" : [ {
  5. "index" : "gb",
  6. "valid" : false,
  7. "error" : "org.elasticsearch.index.query.QueryParsingException:
  8. [gb] No query registered for [tweet]"
  9. } ]
  10. }

理解查询语句

如果是合法语句的话,使用 explain 参数可以返回一个带有查询语句的可阅读描述,
可以帮助了解查询语句在ES中是如何执行的:

  1. GET /_validate/query?explain
  2. {
  3. "query": {
  4. "match" : {
  5. "tweet" : "really powerful"
  6. }
  7. }
  8. }

explanation 会为每一个索引返回一段描述,因为每个索引会有不同的映射关系和分析器:

  1. {
  2. "valid" : true,
  3. "_shards" : { ... },
  4. "explanations" : [ {
  5. "index" : "us",
  6. "valid" : true,
  7. "explanation" : "tweet:really tweet:powerful"
  8. }, {
  9. "index" : "gb",
  10. "valid" : true,
  11. "explanation" : "tweet:really tweet:power"
  12. } ]
  13. }

从返回的 explanation 你会看到 match 是如何为查询字符串 "really powerful" 进行查询的,
首先,它被拆分成两个独立的词分别在 tweet 字段中进行查询。

而且,在索引us中这两个词为"really""powerful",在索引gb中被拆分成"really""power"
这是因为我们在索引gb中使用了english分析器。