Elasticsearch基本操作,增,删,改,查
概述
在学习增删改查之前,先了解下基础知识。
索引:含有相同属性的文档的集合;
类型:索引可以定义一个或多个类型,文档必须属于一个类型;
文档:文档是可以被索引的节本数据单位。
看了是不是感觉很抽象,可以想象下跟数据库对应,索引就是一个数据库,数据库里的表就是一个类型,里面包含的一条一条数据就是文档。
如:我们要设计一个图书管理系统,就需要有图书索引,学生索引,图书索引内又有不同的类型,教育类,科普类,小说类等图书
分片:每个索引都有多个分片,每个分片是一个Lucene索引
备份:拷贝一份分片就完成分片的备份
添加索引
RESTful API风格创建 http://<ip>:<port>/<索引>/<类型>/<文档>
打开postman,有json检查比较容易读懂,不易错误。
结构化创建索引,
{ "settion":{ "number_of_shards":3, "number_of_replicas":1 }, "mappings":{ "teacher":{ "properties":{ "name":{ "type":"text" }, "country":{ "type":"keyword" }, "gender":{ "type":"text" }, "age":{ "type":"integer" }, "date":{ "type":"date", "format":"yyy-MM-dd HH:mm:ss || yyyy-MM-dd" } } } } }
发送PUT请求,添加索引,发现创建成功。
添加
有了索引后,我们进行增加操作。按我们刚才创建的格式添加
注意:我们id我们可以指定,也可以不指定,不指定就会帮我们自动创建一个。
看下添加的数据
修改
修改es文档方式有两种,一种是直接修改,一种是脚本修改,我这边只介绍第一种。现在把刚才数据的性别改为女
浏览数据,可以看到数据修改成功
删除
删除文档
刷新数据可以看到已经被删除
删除索引
索引已经都被我们删除
查询
为了方便查询,我预先插入了十条数据
我们查询文档id为1的数据
接下来进行条件查询
1.查询所有
指定返回的数据
模糊匹配查询
聚合查询
可以看到age字段12岁的有4个人,30岁的有两个人。
对age字段进行聚合计算
总共有10个数,最小的年龄为12岁,最大70岁,他们的平均值是27.7岁,加起来有277岁。
高级查询
Query context(文本查询)
习语匹配 它与模糊匹配的查询比较,就比较精确了
{ "query":{ "match_phrase":{ "name":"张三" } } }
多个字段匹配查询
下列语句表示,张三这个字符串在两个字段,name和gender有的都匹配出来
{ "query":{ "multi_match":{ "query":"张三", "fields":["name","gender"] } } }
语法查询
下列语法表示查询字段含有张三或李四的数据
{ "query":{ "query_string":{ "query":"张三 OR 李四" } } }
确定字段语法查询
{ "query":{ "query_string":{ "query":"张三 OR 李四 OR 男", "fields":["name","country"] } } }
结构化字段的查询
下列表示查询年龄在12岁的数据
{
"query":{
"term":{
"age":12
}
}
}
范围查询
下列查询年龄段12岁到100岁之间的数据
{ "query":{ "range":{ "age":{ "gte":12, "lte":100 } } } }
Filter Context(条件过滤查询)
查询过程中只判断文档是否满足条件,只有Yes和No,这是与Query查询所不同的,不用考虑查询到的数据匹配有多好。
下列查询字段age为12岁的数据
{ "query":{ "bool":{ "filter":{ "term":{ "age":"12" } } } } }
复合查询
固定分数查询(不支持match)
{ "query":{ "constant_score":{ "filter":{ "match":{ "name":"周" } } } } }
分数为1的数据
{ "query":{ "constant_score":{ "filter":{ "match":{ "name":"周" } }, "boost":1 } } }
下列表示OR的关系,名字等于张三或性别为nv的数据
{ "query":{ "bool":{ "should":[ { "match":{ "name":"张三" } }, { "match":{ "gender":"女" } } ] } } }
下列表示AND查询name字段必须为张三,性别也要为女的数据,显然我们的数据是没有的
{ "query":{ "bool":{ "must":[ { "match":{ "name":"张三" } }, { "match":{ "gender":"女" } } ] } } }
下列查询数据name字段必须包含有周,且性别为男,且等于12岁
{ "query":{ "bool":{ "must":[ { "match":{ "name":"周" } }, { "match":{ "gender":"男" } } ], "filter":{ "term":{ "age":12 } } } } }
下列查询除张三以外的数据
{ "query":{ "bool":{ "must_not":{ "term":{ "name":"张三" } } } } }