elasticsearch基本操作(更新)
介绍之前首先看一下es的字段类型:https://blog.****.net/chengyuqiang/article/details/79048800
核心数据类型:
text、byte、short、integer、long、float、double、boolean、date
复合数据类型
array、object
注意:新版本es不支持string类型,支持text
index_ml:索引(相当于关系数据库中的数据库)
type_ml:类型(相当于关系数据库中的表)
(一)简单创建索引
http://10.10.129.21:9200/index_ml/type_ml/1 post请求
{
"name":"zs",
"age":22
}
查看我们的映射:
http://10.10.13.21:9200/index_ml/_mapping?pretty post请求
(二)增加字段
想在已经建好的索引上增加字段
http://10.10.13.21:9200/index_ml/_mapping/type_ml post请求
{
"type_ml":{
"properties":{
"job":{
"type":"text",
"analyzer":"english"
},
"time":{
"type":"date"
}
}
}
}
(三)修改某个字段的值
http://10.10.13.21:9200/index_ml/type_ml/1/_update post请求
{
"doc":{
"name":"lisi"
}
}
(四)增加一条数据
http://10.10.13.21:9200/index_ml/type_ml/2 post请求
{
"doc":{
"name":"zl",
"sex":"男",
"age":28,
"time":"2019-06-25T13:40:00"
}
}
(五)查询(查询语句比较冗余,但是是个查询语句框架,仅供参考指正)
es查询基本模板:from=0,size=0.将不会查询出文档,可以在不需要输出指定文档的情况下仅仅获得聚合结果
{
"query":{
"bool":{
"must":[
{
"match_all":{
}
}
],
"must_not":[
],
"should":[
]
}
},
"from":0,
"size":100,
"aggs":{
}
}
(1)全文搜索文档name为"ma"的字段
{"query":{"bool":{"must":[{"query_string":{"query":"name:ma"}}],"must_not":[],"should":[]}},"from":0,"size":100,"aggs":{}}
(2)所有文档根据性别这个字段聚合
{"query":{"bool":{"must":[{"match_all":{}}],"must_not":[],"should":[]}},"aggs":{"field_define_by_youself":{"terms":{"field":"sex"}}}}
(3)去重 :cardinality
去重性别:
{"query":{"bool":{"must":[{"match_all":{}}]}},"from":0,"size":0,"aggs":{"quchong_by_sex":{"cardinality":{"field":"sex"}}}}
(4)匹配搜索
{"query":{"bool":{"must":[{"match":{"hobby":"climb mountain"}}]}},"from":0,"size":10,"aggs":{}}
(5) 通配符查询 *代表多个字符,?代表一个字符
(6)根据范围查询
说明:#控制范围
#range 查询:范围查询
##有from,to,include_lower,include_upper,boost 这些参数
## include_lower: 是否包含范围的左边界,默认是true
##include_upper: 是否包含范围的右边界,默认是true
{"query":{"bool":{"must":[{"range":{"date":{"include_lower":true,"include_upper":true,"from":"2017-07-01","to":"2018-01-11","time_zone":"+08:00"}}}]}}}
其中date为文档中的时间字段
(7) 按照或年或月或日进行统计一段时间范围内文档的数量
date_histogram是按照时间来构建集合(桶)Buckts的,当我们需要按照时间进行做一些数据统计的时候,就可以使用它来进行时间维度上构建指标分析
参考文档:https://www.cnblogs.com/xing901022/p/4951603.html
interval字段支持多种关键字:`year`, `quarter`, `month`, `week`, `day`, `hour`, `minute`, `second`
在2017-01-01到2018-01-13这段时间内,按照月份进行聚合查询
{"query":{"bool":{"must":[{"range":{"date":{"include_lower":true,"include_upper":true,"from":"2017-01-01","to":"2018-01-13","time_zone":"+08:00"}}}]}},"aggs":{"juhe":{"date_histogram":{"field":"date","interval":"month","format":"yyyy/MM/dd"}}}}
可以看到2017年一月有6片文档,2018年一月有一篇文档(上图没有截全)
(8)term匹配
主要用于精确匹配哪些值,比如数字,日期,布尔值或 not_analyzed 的字符串(未经分析的文本数据类型)
{"query":{"bool":{"must":[{"term":{"sex":"女"}}],"must_not":[{"term":{"name":" "}}],"should":[{"range":{"age":{"from":20,"to":30}}}]}},"aggs":{}}
我们看到,should条件里的age范围20-30,但是返回结果依然有age为35的数据,但是score得分仅仅为0.35,相关性不如上图中第一条数据大,如果想真正把35这个年龄数据的人过滤出去,需要把range条件写进must里:
{"query":{"bool":{"must":[{"term":{"sex":"女"}},{"range":{"age":{"gte":20,"to":30}}}],"must_not":[{"term":{"name":"yu"}}],"should":[]}},"aggs":{}}
(9)terms匹配
terms 跟 term 有点类似,但 terms 允许指定多个匹配条件。 如果某个字段指定了多个值,那么文档需要一起去做匹配
{"query":{"bool":{"must":[{"terms":{"name":["ll","yu"]}}],"must_not":[],"should":[]}},"aggs":{}}
(10)exists 和 missing
exists 和 missing 过滤可以用于查找文档中是否包含指定字段或没有某个字段,类似于SQL语句中的IS_NULL条件
https://www.jianshu.com/p/7a5d706336f1
{"query":{"bool":{"must":[{"missing":{"field":"name1"}}],"must_not":[],"should":[]}},"aggs":{}}
exists:过滤文档中字段。文档中没有该字段,或字段值为null,或多值字段为[]不能被返回,多值字段值(字段所对应的是个数组等)不是全为null可以返回
missing为exits的逆。
(11)高亮
{"query":{"wildcard":{"hobby":"play*"}},"highlight":{"pre_tags":["h1"],"post_tags":["/h1"],"fields":{"hobby":{"type":"plain"}}}}