ES操作及与表的对应关系
0.与表的对应关系
| 关系型数据库(比如Mysql) | 非关系型数据库(ElasticSearch) |
|---|---|
| 数据库Database | 索引Index |
| 表Table | 类型Type(6.0版本之后在一个索引下面只能有一个,7.0版本之后取消了Type) |
| 数据行Row | 文档Document(JSON格式) |
| 数据列Column | 字段Field |
| 约束 Schema | 映射Mapping |
1.管理性命令
/
GET /_cat#查看节点状况GET /_cat/nodes?v#查看健康状况GET /_cat/health#查看所有的indexGET /_cat/indices
2.index操作(索引->数据库)
索引包含一堆有相似结构的文档数据,比如可以有一个客户索引,商品分类索引,订单索引,索引有一个名称。一个index包含很多document,一个index就代表了一类类似的或者相同的document。比如说建立一个product index,商品索引,里面可能就存放了所有的商品数据,所有的商品document。
#查index#查看所有的indexGET /_cat/indices#查看某个index的信息GET /_cat/indices/.kibana_1#查看某个index的元数据信息GET /.kibana_1##查看某个index的表结构GET /stu2/_mapping#新增Index#手动创建 需要在创建index时指定mapping信息#6.0版本一个Index只能创建一个type,名称随意PUT stu{"mappings": {"table1":{"properties":{"id":{"type":"keyword"},"name":{"type":"text"},"sex":{"type":"integer"},"birth":{"type":"date"}}}}}#自动创建 直接向一个不存在的Index插入数据,在插入数据时,系统根据数据的类型,自动推断mapping,自动创建mapping# POST /indexname/typename/idPOST /stu2/table1/1{"age":20,"name":"jack"}#删除indexDELETE /stu2#修改index 需要执行迁移操作,从一个index读取数据,写入一个新的index#判断是否存在index 404 - Not Found代表不存在 ,200代表存在HEAD /stu2
3.type(类型->表)【新版本这东西已经没用了,index其实就可以代替表了】
6.0版本之前每个索引里都可以有多个type;
6.0版本之后每个索引里面只能有一个Type,一般使用_doc代替了。
商品index,里面存放了所有的商品数据,商品document
商品type:product_id,product_name,product_desc,category_id,category_name,service_period
每一个type里面,都会包含一堆document
4.Mapping(映射->约束)
数据如何存放到索引对象上,需要有一个映射配置,包括:数据类型、是否存储、是否分词等。
Mapping用来定义Document中每个字段的类型,即所使用的分词器、是否索引等属性,非常关键等。创建Mapping 的代码示例如下:
PUT stu (stu类似于MySQL中的数据库名){"mappings": { (可以理解为建表语句 create table关键字)"_doc":{ (相当于MySQL中表名)"properties":{ (相当于建表语句中要指定字段及字段类型的关键字)"id":{ (相当于具体某个字段)"type":"keyword"("type"相当于要指定字段类型的关键字,"keyword "相当于字段的具体类型)},"name":{"type":"text"},"sex":{"type":"integer"},"birth":{"type":"date"}}}}}
PUT stu/_doc/1001{"id":"001","name":"红红","sex":0,"birth":"1999-01-01"}
GET stu/_search输出结果如下:{"took" : 9,"timed_out" : false,"_shards" : {"total" : 5, (切片总数)"successful" :"skipped" : 0,"failed" : 0},"hits" : { (命中)"total" : 1, (命中总数一条)"max_score" : 1.0, (数据在里面存储的时候是有一个评分,这个评分是按照搜索的关键字跟文章的匹配度得来的,如果这个关键字在文章中出现频率较高,这个分数也相应的较大)"hits" : [{"_index" : "stu","_type" : "_doc","_id" : "1001","_score" : 1.0,"_source" : { (具体的数据)"id" : "001","name" : "红红","sex" : 0,"birth" : "1999-01-01"}}]}}
5.Document(文档->行)
文档是ES中的最小数据单元,一个document可以是一条客户数据,一条商品分类数据,一条订单数据,
通常用JSON数据结构表示,每个index下的type中,都可以去存储多个document。
6.Field(字段->列)
一个document里面有多个field,每个field就是一个数据字段。
商品type(表):document1(一条数据){"product_id": "1","product_name": "长虹电视机","product_desc": "4k高清","category_id": "3","category_name": "电器","service_period": "1年"}document2(一条数据){"product_id": "2","product_name": "基围虾","product_desc": "纯天然,冰岛产","category_id": "4","category_name": "生鲜","eat_period": "7天"}
7.分词操作
#查#全表查询GET /stu/_searchGET /stu#查询单个元素 GET /indexname/typename/idGET /stu/table1/3#增#POST /indexname/typename/idPOST /stu/table1/3{"name":"jack"}#POST也可以实现更新操作,如果当前记录的ID不存在,就insert,存在就update。 更新是全量更新POST /stu/table1/1{"name":"tom","sex":0}#POST新增,不指定ID,就随机生成IDPOST /stu/table1{"name":"marry"}#改 PUT#新增 PUT在新增时,必须指定id!#id存在就更新,不存在就插入,默认也是全量更新PUT /stu/table1/3{"name":"marry3","sex":0}#不能增量更新PUT /stu/table1/3/_update{"name":"marry4"}# 4xxx开头的都是客户端错误# 405: 客户端发送的请求方式错误,例如只允许发POST,你发了PUT# 400 : 请求参数格式错误。没有按照人家指定的格式发参数POST /stu/table1/3/_update{"doc": {"name":"marry4"}}#删DELETE /stu/table1/3#判断是否存在HEAD /stu/table1/1
text(允许分词) keyword(不允许分词)
GET /_analyze{"text": "I am a Chinese!"}# 默认的分词器,用来进行英文分词,按照空格分# 汉语按照字切分GET /_analyze{"text": "我是清朝老兵!"}GET /_analyze{"keyword": "我是清朝老兵!"}#ik_smart: 智能分词。切分的所有单词的总字数等于 词的总字数 输入总字数=输出总字数#ik_max_word: 最大化分词。 输入总字数 <= 输出总字数GET /_analyze{"analyzer": "ik_smart","text": "我是清朝老兵!我请求为国出战!"}GET /_analyze{"analyzer": "ik_smart","text": "我是中国人"}GET /_analyze{"analyzer": "ik_max_word","text": "我喜欢抽烟喝酒烫头洗屁股眼子!"}
8.子属性
java中:public class Person{public String name;public Address address;}public class Address{public String provinceName;}provinceName称为是Person类的 级联(层级联系)属性, 或子属性(属性的属性)json中:person:{age: 20address:{"provinceName":"广东"}}注意:"name" : {"type" : "text","fields" : {"aaa" : {"type" : "keyword","ignore_above" : 256}}}text类型的字段,如果将来需要聚合,一定需要为其设置一个子属性,子属性的类型必须是keyword类型!
