概要
本篇介绍Query DSL的语法案例,查询语句的调试,以及排序的相关内容。
基本语法
空查询
最简单的搜索命令,不指定索引和类型的空搜索,它将返回集群下所有索引的所有文档(默认显示10条):
GET /_search
{}
搜索多个索引
GET /index1,index2/_doc/_search
{}
指定分页搜索
GET /_search
{
"from": 0,
"size": 10
}
get带request body
HTTP协议,GET请求带body是不规范的做法,但由于ES搜索的复杂性,加上HTTP协议GET/POST方法表述的语义,GET更适合用来表述查询的动作,虽然不规范,但还是这么用了。现在大多数浏览器也支持GET request body,如果遇到不支持的,换成POST即可。了解一下就行,不用太慌张。
查询表达式Query DSL
Query DSL是一种非常灵活、可读性高的查询语言,body为JSON格式,绝大部分功能都可以用它来展现,并且这种查询语句更纯粹,让学习者更专注于本身的功能,避免Client API的干扰。
上一节的空查询,等价于这个:
GET /_search
{
"query": {
"match_all": {}
}
}
基本语法
# 查询语句结构
{
QUERY_NAME: {
ARGUMENT: VALUE,
ARGUMENT: VALUE,...
}
}
# 针对某个字段的查询
{
QUERY_NAME: {
FIELD_NAME: {
ARGUMENT: VALUE,
ARGUMENT: VALUE,...
}
}
}
合并查询语句
再复杂的查询语句,也是由一个一个的查询条件叠加而成的,查询语句有两种形式:
- 叶子语句:单个条件组成的语句,如match语句,类似mysql的"id = 1"这种。
- 复合语句:有多个条件,需要合并在一起才能组成一个完整的语句,需要使用bool进行组合,里面的条件可以用must必须匹配、must not必须不匹配、should可以匹配修饰,也可以包含过滤器filter。类似mysql的"(status = 1 && language != 'french' && (author = 'John' || author = 'Tom'))"这种。
举个例子:
{
"bool": {
"must": { "match": { "status": 1 }},
"must_not": { "match": { "language": "french" }},
"should": { "match": { "author": "John Tom" }},
"filter": { "range": {