序言
收集整理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.
时间的四舍五入
针对>,>=,<,<=的判断条件的四舍五入情况说明
- "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"
}
}
]
}
本文详细介绍Elasticsearch中常用的字符查询、逻辑与(AND)、逻辑或(OR)、时间查询、排序及日期范围处理,助你快速提升搜索效率。
2158

被折叠的 条评论
为什么被折叠?



