首页 > 技术文章 > DSL查询(query dsl)

blog1350995917 2014-06-04 14:05 原文

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

推荐阅读