ES使用灵活的,容易表达的Query DSL,通过JSON接口暴露了Lucene大部分的功能,这也是让你在产品中使用的原因。他能使你的查询更灵活,更精确,更容易阅读,更容易调试。
使用query DSL,要在query参数中传递消息体:
GET /_search
{
"query": YOUR_QUERY_HERE
}
上一章节——”empty search“——{}——在功能上等同于使用match_all查询:
GET /_search
{
"query":{
"match_all":{}
}
}
结构化查询条款(structure of a query clause)
一个典型的结构化查询条款有如下形式:
{
QUERY_NAME:{
ARGUMENT: VALUE,
ARGUMENT: VALUE,...
}
}
或者,引用另外一个特定的field:
{
QUERY_NAME:{
FIELD_NAME:{
ARGUMENT: VALUE,
ARGUMENT: VALUE,...
}
}
}
例如,你能使用match查询找到tweets中tweet field中有”elasticsearch“的:
{
"match":{
"tweet":"elasticsearch"
}
}
全部的搜索请求如下:
GET /_search
{
"query":{
"match":{
"tweet":"elasticsearch"
}
}
}
联合多条目查询(combining multiple clauses)
查询条目可以时简单的一个,也可以是相互联联合创建复杂的查询,条目可以如下组合:
1:leaf clauses(比如match)被用来与一个或多个field比较quert string
2:compound clauses用来和其他的查询想集合,例如一个bool查询允许你联合must匹配,must_not匹配,或者should匹配:
{
"bool":{
"must": {"match":{"tweet":"elasticsearch"}},
"must_not":{"match":{"name": "mary"}},
"should": {"match":{"tweet":"full text"}}
}
}
很重要的一点就是compound clause即能联合其他的查询条目,也能包括其他的compound clause。也就是说compound clause能相互嵌套,表达更复杂的逻辑。
例如,下面的查询emails包括”business opportunity“并且要么starred是true,要么folder是inbox并且spam是true:
{
"bool":{
"must":{"match": {"email":"business opportunity"}},
"should":[
{"match": {"starred":true}},
{"bool":{
"must": {"folder":"inbox"}},
"must_not": {"spam":true}}
}}
],
"minimum_should_match":1
}
}
先不要担心这个例子的细节——我们稍后将会详细介绍。重要的就是要明白在一个查询中compound clause能联合很多的查询条目——不单单leaf clause而且也有其他的compound clause。
原文:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/query-dsl-intro.html