1、Document数据格式
面向文档的搜索分析引擎
(1)应用系统的数据结构都是面向对象的,复杂的。
(2)对象数据存储到数据库中,只能拆解开来,变为扁平的多张表,每次查询的时候还得还原回对象格式,相当麻烦。
**(3)**ES是面向文档的,文档中存储的数据结构,与面向对象的数据结构是一样的,基于这种文档数据结构,ES可以提供复杂的索引,全文检索,分析聚合等功能。
**(4)**ES的document用json数据格式来表达。
1.1 下面分析ES中的document格式和数据库中的表的格式
通常Java中面向对象的Bean如下:
public class Employee {
private String email;
private String firstName;
private String lastName;
private EmployeeInfo info;
private Date joinDate;
}
private class EmployeeInfo {
private String bio; // 性格
private Integer age;
private String[] interests; // 兴趣爱好
}
如果是数据库存储,需要两张表:employee表和employee_info,需要将Employee对象的数据重新拆开来,变成Employee数据和EmployeeInfo数据。其中数据表信息为:
employee表:email,first_name,last_name,join_date,4个字段
employee_info表:bio,age,interests,3个字段;此外还有一个外键字段,比如employee_id,关联着employee表
假设Java我们想做如下操作:
EmployeeInfo info = new EmployeeInfo();
info.setBio("curious and modest");
info.setAge(30);
info.setInterests(new String[]{"bike", "climb"});
Employee employee = new Employee();
employee.setEmail("zhangsan@sina.com");
employee.setFirstName("san");
employee.setLastName("zhang");
employee.setInfo(info);
employee.setJoinDate(new Date());
从上面可以知道在Employee的表中含有info的信息。如果是在ES中,我们需要封装出如下的结构:
{
"email" : "zhangsan@sina.com",
"first_name" : "san",
"last_name" : "zhang",
"info" : {
"bio" : "curious and modes",
"age" : 30,
"interests": [ "bike", "climb" ]
},
"join_data" : "2017/01/01"
}
从上面的例子中,就可以明白es的document数据格式和数据库的关系型数据格式的区别。
2.电商网站商品管理案例背景介绍
有一个电商网站,需要为其基于ES构建一个后台系统,提供一下功能:
(1)对商品信息进行CRUD(增删改查)操作。
(2)执行简单的结构化查询。
(3)可以执行简单的全文检索,以及复杂的phrase(短语)检索。
(4)对全文检索的结果,可以进行高亮显示。
(5)对数据进行简单的聚合分析。
3.简单的集群管理:
(1)快速检查集群的健康状况
ES提供了一套api,叫做cat api,可以查看ES中各种各样的数据。
检查集群的健康状态:
在Kibana的DevTools中输入:GET /_cat/health?v,效果如下:
注意:上面的status是yellow的。
当启动了另外一个ES后(复制一个ES的安装文件,文件夹重命名一下,然后再双击一下D:\installed\elasticsearch\elasticsearch-5.2.0.2\bin\elasticsearch.bat)
进入kibana的DevTools,然后再执行一下:GET /_cat/health?v
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1500611289 12:28:09 elasticsearch green 2 2 12 6 0 0 0 0 - 100.0%
(2)如何快速了解集群的健康状况?green、yellow、red?
green:每个索引的primary shard和replica shard都是active状态的。
yellow:每个索引的primary shard都是active状态的,但是部分replica shard不是active状态,处于不可用的状态。
red:不是所有索引的primary shard都是active状态的,部分索引有数据丢失了。
(3)只有一个ES的时候,处于yellow状态的原因是啥?
现在就一个笔记本电脑,启动了一个ES进程,相当于就只有一个node。现在ES中有一个index,就是kibana自己内置建立的index。由于默认的配置是给每个index分配5个primary shard和5个replica shard。而且primary shard和replica shard不能在同一台机器上(为了容错)。现在kibana自己建立的index是1个primary shard和1个replica shard.当前就一个node,所以只有1个primary shard被分配了和启动了。
(4)快速查看集群中有哪些索引
GET /_cat/indices?v
结果是:
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open ecommerce 4kSE52b0TLGJ1Ss4fDGBnQ 5 1 1 0 6.2kb 6.2kb
yellow open .kibana pGkQqwXUT4-nEY3EXPT-rg 1 1 1 0 3.1kb 3.1kb
(5)简单的索引操作
创建索引:PUT /test_index?pretty
执行完成之后,返回结果:
{
"acknowledged": true,
"shards_acknowledged": true
}
查看索引:
GET /_cat/indices?v
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open ecommerce 4kSE52b0TLGJ1Ss4fDGBnQ 5 1 1 0 6.2kb 6.2kb
yellow open .kibana pGkQqwXUT4-nEY3EXPT-rg 1 1 1 0 3.1kb 3.1kb
yellow open test_index NKZYw_dyQtO6p0mu479D9w 5 1 0 0 650b 650b
从上面可以看出增加了一个test_index索引。
(6)删除索引
DELETE /test_index?pretty
运行后返回的结果集是:
{
"acknowledged": true
}
再次查询结果,结果如下:
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open ecommerce 4kSE52b0TLGJ1Ss4fDGBnQ 5 1 1 0 6.2kb 6.2kb
yellow open .kibana pGkQqwXUT4-nEY3EXPT-rg 1 1 1 0 3.1kb 3.1kb
4、商品的CRUD操作
(1)新增商品:新增文档,建立索引
PUT /index/type/id
{
"json数据"
}
PUT /ecommerce/product/1
{
"name" : "gaolujie yagao",
"desc" : "gaoxiao meibai",
"price" : 30,
"producer" : "gaolujie producer",
"tags": [ "meibai", "fangzhu" ]
}
执行之后,在右侧的kibana显示的效果如下:
{
"_index": "ecommerce",
"_type": "product",
"_id": "1",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"created": true
}
新增第二条索引:
PUT /ecommerce/product/2
{
"name" : "jiajieshi yagao",
"desc" : "youxiao fangzhu",
"price" : 25,
"producer" : "jiajieshi producer",
"tags": [ "fangzhu" ]
}
PUT /ecommerce/product/3
{
"name" : "zhonghua yagao",
"desc" : "caoben zhiwu",
"price" : 40,
"producer" : "zhonghua producer",
"tags": [ "qingxin" ]
}
es会自动建立index和type,不需要提前创建,而且es默认会对document每个field都建立倒排索引,让其可以被搜索
(2)查询商品:检索文档
GET /index/type/id
GET /ecommerce/product/1
{
"_index": "ecommerce",
"_type": "product",
"_id": "1",
"_version": 1,
"found": true,
"_source": {
"name": "gaolujie yagao",
"desc": "gaoxiao meibai",
"price": 30,
"producer": "gaolujie producer",
"tags": [
"meibai",
"fangzhu"
]
}
}
(3)修改商品:替换文档
PUT /ecommerce/product/1
{
"name" : "jiaqiangban gaolujie yagao",
"desc" : "gaoxiao meibai",
"price" : 30,
"producer" : "gaolujie producer",
"tags": [ "meibai", "fangzhu" ]
}
如果是创建,执行完成之后,kibana的右侧出现的内容是:
{
"_index": "ecommerce",
"_type": "product",
"_id": "1",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"created": true
}
如果是修改,kibana的右侧出现下面的内容:
{
"_index": "ecommerce",
"_type": "product",
"_id": "1",
"_version": 2,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"created": false
}
PUT /ecommerce/product/1
{
"name" : "jiaqiangban gaolujie yagao"
}
替换方式有一个不好,即使必须带上所有的field,才能去进行信息的修改
(4)修改商品:更新文档
POST /ecommerce/product/1/_update
{
"doc": {
"name": "jiaqiangban gaolujie yagao"
}
}
执行之后,显示在右边的内容如下:
{
"_index": "ecommerce",
"_type": "product",
"_id": "1",
"_version": 8,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
}
}
然后再:GET /ecommerce/product/1,发现只有指定field中的内容发生了变化。
我的风格,其实有选择的情况下,不太喜欢念ppt,或者照着文档做,或者直接粘贴写好的代码,尽量是纯手敲代码
(5)删除商品:删除文档
DELETE /ecommerce/product/1
{
"found": true,
"_index": "ecommerce",
"_type": "product",
"_id": "1",
"_version": 9,
"result": "deleted",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
}
}
删除后,kibana的右侧显示的内容如下:
{
"_index": "ecommerce",
"_type": "product",
"_id": "1",
"found": false
}
再重新创建回来,创建方式是:
PUT /ecommerce/product/1
{
"name":"jiaqiangban gaoluejie yagao",
"desc":"gaoxiao meibai",
"price":30,
"producer":"gaolujie producer",
"tags":["meibai","fangzhu"]
}