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
#查看所有的index
GET /_cat/indices
2.index操作(索引->数据库)
索引包含一堆有相似结构的文档数据,比如可以有一个客户索引,商品分类索引,订单索引,索引有一个名称。一个index包含很多document,一个index就代表了一类类似的或者相同的document。比如说建立一个product index,商品索引,里面可能就存放了所有的商品数据,所有的商品document。
#查index
#查看所有的index
GET /_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/id
POST /stu2/table1/1
{
"age":20,
"name":"jack"
}
#删除index
DELETE /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/_search
GET /stu
#查询单个元素 GET /indexname/typename/id
GET /stu/table1/3
#增
#POST /indexname/typename/id
POST /stu/table1/3
{
"name":"jack"
}
#POST也可以实现更新操作,如果当前记录的ID不存在,就insert,存在就update。 更新是全量更新
POST /stu/table1/1
{
"name":"tom",
"sex":0
}
#POST新增,不指定ID,就随机生成ID
POST /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: 20
address:{
"provinceName":"广东"
}
}
注意:
"name" : {
"type" : "text",
"fields" : {
"aaa" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
text类型的字段,如果将来需要聚合,一定需要为其设置一个子属性,子属性的类型必须是keyword类型!