序言

收集整理ES常用的一些查询类型.持续更新.

基本信息

常用字符

符号

含义

gte

greater-than or equal to, 大于或等于

gt

greater-than, 大于

lte

less-than or equal to, 小于或等于

lt

less-than, 小于

逻辑查询

或(OR)

#如果有多个搜索关键字, Elastic 认为它们是or关系。
$ curl 'localhost:9200/accounts/person/_search'  -d '
{
  "query" : { "match" : { "desc" : "软件 系统" }}
}'

与(AND)

格式是:

{
  "query": {
    "bool": {
      "must": [
                {query_type:1},

                {query_type:2}
        ]
    }
}

例子:

#如果要执行多个关键词的and搜索,必须使用布尔查询。
$ curl 'localhost:9200/accounts/person/_search'  -d '
{
  "query": {
    "bool": {
      "must": [        #注意这里的与的关系 是数组内涵对象.
        { "match": { "desc": "软件" } },
        { "match": { "desc": "系统" } }
      ]
    }
  }
}

时间查询

时间表达式的使用

表达式

含义

表达式

含义

y


M


w

星期

d


h

小时

H

小时

m

分钟

s


now  

系统当前时间

||        

用于拼接时间和字符串

  • +1h —— 加1小时;
  • -1d —— 减1天;
  • /d  —— 四舍五入到最近的一天.
  • /m  —— 四舍五入到最近的一月
  • /y  —— 四舍五入到最近的一年

说明: 假设系统当前时间now = 2018-10-01 12:00:00 :

  • now+1h: now的毫秒值 + 1小时, 结果是: 2018-10-01 13:00:00.
  • now-1h: now的毫秒值 - 1小时, 结果是: 2018-10-01 11:00:00.
  • now-1h/d: now的毫秒值 - 1小时, 然后四舍五入到最近的一天的起始, 结果是: 2018-10-01 00:00:00.
  • 2018.10.01||+1M/d: 2018-10-01的毫秒值 + 1月, 再四舍五入到最近一天的起始, 结果是: 2018-11-01 00:00:00.

时间的四舍五入

针对>,>=,<,<=的判断条件的四舍五入情况说明

  1. "gt": "2018-12-18||/M" —— 大于日期, 需要向上舍入, 结果是2018-12-31T23:59:59.999, 也就是不包含整个12月.
  2. "gte": "2018-12-18||/M" —— 大于或等于日期, 需要向下舍入, 结果是 2018-12-01, 也就是包含整个12月.
  3. "lt": "2018-12-18||/M" —— 小于日期, 需要向上舍入, 结果是2018-12-01, 也就是不包含整个12月.
  4. "lte": "2018-12-18||/M" —— 小于或等于日期, 需要向下舍入, 结果是2018-12-31T23:59:59.999, 也就是包含整个12月.

日期格式化范围

格式化还是很有用的,比如.我们只需要比对年份.

GET website/_search
{
    "query": {
        "range": {
            "post_date": {
                "gte": "2/1/2018", 
                "lte": "2019",
                "format": "dd/MM/yyyy||yyyy"
            }
        }
    }
}

用例

//首先resultDateTime的值必须存在,另外resultDateTime的时间要小于等于今年.
{
    "size":0,
    "query":{
        "bool":{
            "must":[
                {
                    "exists":{
                        "field":"resultDateTime"
                    }
                },
                {
                    "range":{
                        "resultDateTime":{
                            "lt":"now+1y",
                            "format":"yyyy"
                        }
                    }
                }
            ]
        }
    },
    "aggs":{
        "groupDate":{
            "date_histogram":{
                "field":"resultDateTime",
                "min_doc_count":0,
                "interval":"1y"
            },
            "aggs":{
                "aggs_clean_state":{
                    "terms":{
                        "field":"cleanState",
                        "size":5
                    }
                }
            }
        }
    }
}

排序

首先排序只针对特定的字段类型.

  1. 字符串类型text 、 keyword(text类型在存储数据的时候会默认进行分词,并生成索引。而keyword存储数据的时候,不会分词建立索引,显然,这样划分数据更加节省内存)
  2. 数值类型long, integer, short, byte, double, float, half_float, scaled_float
  3. 日期类型date
  4. 布尔值类型boolean
  5. 二进制类型binary
  6. 范围类型integer_range, float_range, long_range, double_range, date_range

如上text是会进行拆词所以不能进行排序.只能针对keyword类型的字符串可以进行排序.

如果你没有为字段设置类型这回用默认类型FieldType.Auto,该类型也默认会进行拆词且不能排序cuiyaonan2000@163.com

如果非要给text或者auto的字符串排序,则可以增加 keyword来排序

//价格默认是数字类型不进行拆词可以进行排序
{
  "sort":[
      {
        "price":{
          "order":"desc"
        }
      }
    ]
}


//name是text或者auto类型,则会进行拆词,不能进行排序
//如果非要使用排序则需要按照如下的内容进行书写 加上一个keyword
{
  "sort":[
      {
        "name.keyword":{
          "order":"desc"
        }
      }
    ]
}