查询表达式(Query DSL)是一种非常灵活又富有表现力的查询语言。Elasticsearch使用他可以以简单的JSON接口来展现Lucene功能的绝大部分。在你的应用中,你应该用它来编写你的查询语句。他可以使你的查询语句更灵活、更精确、易读和易调试。
要使用这种查询表达式,只需要将查询语句传递给query 参数:
GET /_search{"query": YOUR_QUERY_HERE}
空查询(empty search)——{}——在功能上等价于使用match_all查询,正如其名字一样,匹配所有文档:
GET /_search
{
"query": {
"match_all": {}
}
}
查询语句的结构:
一个查询语句的典型结构:
{
QUERY_NAME: {
ARGUMENT: VALUE,
ARGUMENT: VALUE,...
}
}
如果是针对某个字段,那么他的结构如下:
{
QUERY_NAME: {
FIELD_NAME: {
ARGUMENT: VALUE,
ARGUMENT: VALUE,...
}
}
}
举个例子,你可以使用match 查询语句来查询tweet 字段中包含Elasticsearch的tweet:
{
"match": {
"tweet": "elasticsearch"
}
}
完整的查询请求如下:
GET /_search
{
"query": {
"match": {
"tweet": "elasticsearch"
}
}
}
合并查询语句
查询语句(Query clauses)就像一些简单的组合块,这些组合块可以彼此间合并组成更复杂的查询。这些语句可以是如下形式:
- 叶子语句(Left clauses)(就像match语句)被用于将查询字符串和一个字段(或者多个字段)对比。
- 复合(Compound)语句 主要用于合并其他查询语句。比如,一个bool 语句允许在你需要的时候组合其他语句,无论是must 匹配、must_not 匹配还是should 匹配,同时他可以包含不评分的过滤器(filters):
一条复合语句可以合并任何其他查询语句,包括复合语句,了解这一点是很重要的。这就意味着,复合语句之间可以相互嵌套,可以表达非常复杂的逻辑。{ "bool": { "must": { "match": { "tweet": "elasticsearch" }}, "must_not": { "match": { "name": "mary" }}, "should": { "match": { "tweet": "full text" }}, "filter": { "range": { "age" : { "gt" : 30 }} } } }
例如,以下查询时为了找出信件正文包含business opportunity 的星标邮件,或者在收件箱正文包含business opportunity 的非垃圾邮件:
{
"bool": {
"must": { "match": { "email": "business opportunity" }},
"should": [
{ "match": { "starred": true }},
{ "bool": {
"must": { "match": { "folder": "inbox" }},
"must_not": { "match": { "spam": true }}
}}
],
"minimum_should_match": 1
}
}
到目前为止,你不必太在意这个例子的细节,我们会在后面详细解释。最重要的是你要理解到,一条复合语句可以将多条语句——叶子语句和其他复合语句——合并成一个单一的查询语句。
