Elasticsearch中的Query DSL

Elasticsearch提供了一个可以执行查询的Json风格的DSL(domain-specific  language领域特定语言)。这个被称为Query DSL,该查询语言非常全面,并且刚开始的时候感觉有点复杂,真正学好它的方法是从一些基础的示例开始的。
  • 一个查询语句的典型结构
{
    QUERY_NAME:{
        ARGUMENT: VALUE, 
        ARGUMENT: VALUE,...
    }
}
  • 如果是针对某个字段,那么它的结构如下:
 
{
    QUERY_NAME:{
        FIELD_NAME:{
            ARGUMENT: VALUE,
            ARGUMENT: VALUE,...
        }
    }
}
 
 
{
    "query":{
        "match all":{}:
    },
    "from":0,
    "size":5,
    "sort":[
        {
           "account number": {
               "order": "desc"
            }
        }
    ]
}
  • query定义如何查询,
  • match-all查询类型【代表查询所有的所有】,es中可以在query中组合非常多的查询类型完成复杂查询
  • 除了query参数之外,我们也可以传递其它的参数以改变查询结果。如sort,size
  • from-size限定,完成分页功能
  • sort排序,多字段排序,会在前序字段相等时后续字段内部排序,否则以前序为准
 
2)、返回部分字段
{
    "query":{
        "match all":{}:
    },
    "sort":[
        {
           "account number": {
               "order": "desc"
            }
        }
    ],
    "from":0,
    "size":5,
    "_source":["age","balance"]
}
 
3)、match【匹配查询】
  • 基本类型(非字符串),精确匹配
GET bank/_search
{
  "query": {
    "match": {
      "account_number": "20"
    }
  }
}
match返回account_number=20的
  • 字符串,全文检索
GET bank/_search
{
  "query": {
    "match": {
      "address": "mill"
    }
  }
}
最终查询出address中包含mill单词的所有记录
match当搜索字符串类型的时候,会进行全文检索,并且每条记录有相关性得分
  • 字符串,多个单词(分词+全文检索)
GET bank/_search
{
  "query": {
    "match": {
      "address": "mill load"
    }
  }
}
最终查询出address中包含mill或者road或者millroad的所有记录,并给出相关性得分
 
4)、match_phrase【短语匹配】
将需要匹配的值当成一个整体单词(不分词)进行检素
GET bank/_search
{
  "query": {
    "match_phrase": {
      "address": "mill road"
    }
  }
}
查出address中包含millroad的所有记录,并给出相关性得分
 
5)、multi_match【多字段匹配】
GET bank/_search
{
  "query": {
    "multi_match": {
      "query": "mill",
      "fields": ["state","address"]
    }
  }
}
state或者address包含mill
 
6)、bool【复合查询】
bool用来做复合查询:复合语句可以合并任何其它查询语句,包括复合语句,了解这一点是很重要的。这就意味
GET bank/_search
{
  "query": {
    "bool": {
      "must": [
        {"match": {
          "gender": "M"
        }},
        {"match": {
          "address": "mill"
        }}
      ],
      "must_not": [
        {"match": {
          "age": "18"
        }}
      ],
      "should": [
        {"match": {
          "lastname": "Wallace"
        }}
      ]
    }
  }
}
 
7)、filter【过滤查询】
GET bank/_search
{
  "query": {
    "bool": {
      "filter": {
        "range": {
          "age": {
            "gte": 18,
            "lte": 30
          }
        }
      }
    }
  }
}
可以达到和must,must not,should相同的结果,但是没有相关性得分
 
 
8)、term
和match一样。匹配某个属性的值。全文检索字段用match,其他非text字段匹配用term
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章