ES查询body合集

#ES #查询 #DSL #Elasticsearch

总结
  • term 类查询用于精确匹配,bool 查询用于组合条件
  • filter 和 must 都要求文档满足条件,区别是 filter 不打分,性能更好
  • 聚合分指标聚合(avg/min/max/sum)和桶聚合(类似 group by)

1. term 类查询

精确查询

{
  "query": {
    "term": {
      "jerseNo": "23"
    }
  }
}

非空查询

{
  "query": {
    "exists": {
      "field": "teamNameEn"
    }
  }
}

前缀查询

{
  "query": {
    "prefix": {
      "teamNameEn": "Rock"
    }
  }
}

通配符查询

* 匹配任意多个字符,? 匹配单个字符:

{
  "query": {
    "wildcard": {
      "teamNameEn": "Ro*k"
    }
  }
}

正则查询

{
  "query": {
    "regexp": {
      "teamNameEn": "Ro.*k"
    }
  }
}

ids 查询

{
  "query": {
    "ids": {
      "values": [1, 2]
    }
  }
}

2. 范围查询

数值范围

{
  "query": {
    "range": {
      "playYear": {
        "gte": 2,
        "lt": 8
      }
    }
  }
}

日期范围

{
  "query": {
    "range": {
      "birthDay": {
        "gte": "01/01/1999",
        "lt": "2022",
        "format": "dd/MM/yyyy||yyyy"
      }
    }
  }
}

3. bool 查询

bool 查询用来组合多个条件,四个子句:

子句 说明
must 必须满足,参与打分
filter 必须满足,不打分(性能更好,推荐用于过滤条件)
must_not 不能满足
should 应该满足,不强制;配合 minimum_should_match 使用

must

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "displayNameEn": "james"
          }
        }
      ]
    }
  }
}

filter

{
  "query": {
    "bool": {
      "filter": [
        {
          "match": {
            "displayNameEn": "james"
          }
        }
      ]
    }
  }
}

must + must_not + should 组合

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "displayNameEn": "james"
          }
        }
      ],
      "must_not": [
        {
          "term": {
            "teamConferenceEn": {
              "value": "Eastern"
            }
          }
        }
      ],
      "should": [
        {
          "range": {
            "playYear": {
              "gte": 11,
              "lte": 20
            }
          }
        }
      ]
    }
  }
}

should 单独用时不强制匹配,配合 minimum_should_match 可以指定最少满足几个条件:

{
  "query": {
    "bool": {
      "should": [...],
      "minimum_should_match": 2
    }
  }
}

4. 排序

多字段排序,先按 playYear 降序,再按 heightValue 升序:

{
  "query": {
    "match": {
      "teamNameEn": "Rockets"
    }
  },
  "sort": [
    {
      "playYear": {
        "order": "desc"
      }
    },
    {
      "heightValue": {
        "order": "asc"
      }
    }
  ]
}

5. 聚合查询

指标聚合

size: 0 表示不返回文档,只返回聚合结果:

{
  "query": {
    "match": {
      "teamNameEn": "Rockets"
    }
  },
  "aggs": {
    "avgAge": {
      "avg": {
        "field": "age"
      }
    }
  },
  "size": 0
}

支持的指标:avgminmaxsumcount

桶聚合(group by)

teamNameEn 分组,统计每组数量:

{
  "aggs": {
    "byTeam": {
      "terms": {
        "field": "teamNameEn"
      }
    }
  },
  "size": 0
}

桶聚合里还可以嵌套指标聚合,比如每个队的平均年龄:

{
  "aggs": {
    "byTeam": {
      "terms": {
        "field": "teamNameEn"
      },
      "aggs": {
        "avgAge": {
          "avg": {
            "field": "age"
          }
        }
      }
    }
  },
  "size": 0
}

6. 面试相关

ES 的查询 DSL 是面试重点,如果你被问到查询优化,可以重点准备 ES面试题 中的查询性能优化、filter vs must 区别等相关问题。