序言
收集整理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": "系统" } }
]
}
}
}
时间查询
时间表达式的使用
表达式 | 含义 | 表达式 | 含义 |
| 年 |
| 月 |
| 星期 |
| 天 |
| 小时 |
| 小时 |
| 分钟 |
| 秒 |
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.
时间的四舍五入
针对>,>=,<,<=的判断条件的四舍五入情况说明
- "gt": "2018-12-18||/M" —— 大于日期, 需要向上舍入, 结果是2018-12-31T23:59:59.999, 也就是不包含整个12月.
- "gte": "2018-12-18||/M" —— 大于或等于日期, 需要向下舍入, 结果是 2018-12-01, 也就是包含整个12月.
- "lt": "2018-12-18||/M" —— 小于日期, 需要向上舍入, 结果是2018-12-01, 也就是不包含整个12月.
- "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
}
}
}
}
}
}
排序
首先排序只针对特定的字段类型.
- 字符串类型text 、 keyword(text类型在存储数据的时候会默认进行分词,并生成索引。而keyword存储数据的时候,不会分词建立索引,显然,这样划分数据更加节省内存)
- 数值类型long, integer, short, byte, double, float, half_float, scaled_float
- 日期类型date
- 布尔值类型boolean
- 二进制类型binary
- 范围类型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"
}
}
]
}