• 验证查询
  • 理解错误信息
  • 理解查询语句

    验证查询

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

    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分析器。