elasticsearch和kibana都已经安装和启动了,下就开始进行实战了node
首先来说一下ES为何面向文档以及面向文档的好处。
(1)通常应用系统的数据结构都是面向对象的,结构复杂,操做起来特别不方便。若是将对象数据存储到数据库中,只能拆解开来,变为扁平的多张表,每次查询的时候还得还原回对象格式,至关的麻烦。
(2)ES是面向文档的,文档中存储的数据结构,与面向对象的数据结构是同样的,基于这种文档的数据结构,es能够提供复杂的索引,全文检索,分析聚合等的功能。
(3)es的document底层是用json数据格式来表达的,json的优点就用说了,附上一篇文章来讲明 https://blog.csdn.net/it_drea...数据库
对象的数据结构:json
public class Employee { private String email; private String firstName; private String lastName; private EmployeeInfo info; private Date joinDate; } public class EmployeeInfo { private String bio; private Integer age; private String[] interests; } 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表,employee_info表,将employee对象的数据从新拆开来,变成Employee数据和EmployeeInfo数据
employee表:email,first_name,last_name,join_date,4个字段
employee_info表:bio,age,interests,3个字段
从外还有一个外键字段,好比employee_id关联着employee表api
ES面向文档的json数据结构:数据结构
{ "email":"zhangsan@sina.com", "first_name":"san", "last_name":"zhang", "info": { "bio":"curious and modest", "age":30, "interests":["bike", "climb"] }, "join_date":"2017/01/01" }
这里咱们就能够明白ES的document数据格式和数据库的关系型数据库的区别elasticsearch
有一个电商网站,须要为其基于ES构建一个后台系统,提供如下功能:
(1)对商品信息进行CRUD(增删改查)操做
(2)执行简单的结构化查询
(3)能够执行简单的全文检索,以及复杂的phrase(短语)检索
(4)对于全文检索的结果,能够进行高亮显示
(5)对数据进行简单的聚合分析性能
es提供了一套api,叫作cat api,能够查看ES的各类各样的配置以及状态数据网站
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 1555412142 10:55:42 elasticsearch green 1 1 2 2 0 0 0 0 - 100.0%
快速了解集群的健康情况,查看status参数值便可ui
GET /_cat/indices?v health status index uuid pri rep docs.count docs.deleted store.size pri.store.size green open .kibana_task_manager q25yU7fCQlKw5PnMwe-IPA 1 0 2 0 45.5kb 45.5kb green open .kibana_1 u3ZsZEtUQCiIFpng4Z-Mww 1 0 3 0 14.2kb 14.2kb
建立索引.net
PUT /test_index?pretty { "acknowledged" : true, "shards_acknowledged" : true, "index" : "test_index" }
删除索引
DELETE /test_index?pretty { "acknowledged" : true }
一、新增商品:新增文档,创建索引
格式
PUT /{index}/{type}/{id} { "json数据" }
PUT /product/_doc/1 { "name":"gaolujie yagao", "desc": "gaoxiao meibai", "price":30, "producer":"gaolujie producer", "tags":["meibai", "fangzhu"] } { "_index" : "product", "_type" : "_doc", "_id" : "1", "_version" : 1, "result" : "created", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 0, "_primary_term" : 1 } PUT /product/_doc/2 { "name" : "jiajieshi yagao", "desc" : "youxiao fangzhu", "price" : 25, "producer" : "jiajieshi producer", "tags": [ "fangzhu" ] } PUT /product/_doc/3 { "name":"zhonghua yagao", "desc": "caoben zhiwu", "price":40, "producer" :"zhonghua producer", "tags":["qingxin"] }
这里不用事先建立好索引index和类型type,ES会默认对document每一个field都创建倒排索引,让其能够被搜索
二、查询商品:检索文档
格式:
GET /{index}/{type}/{id}
GET /product/_doc/1 { "_index" : "product", "_type" : "_doc", "_id" : "1", "_version" : 1, "_seq_no" : 0, "_primary_term" : 1, "found" : true, "_source" : { "name" : "gaolujie yagao", "desc" : "gaoxiao meibai", "price" : 30, "producer" : "gaolujie producer", "tags" : [ "meibai", "fangzhu" ] } }
三、修改商品:替换文档
格式:
PUT /{index}/{type}/{id} { "json数据" }
PUT /product/_doc/1 { "name" : "jiaqiangban gaolujie yagao", "desc" : "gaoxiao meibai", "price" : 30, "producer" : "gaolujie producer", "tags": [ "meibai", "fangzhu" ] } { "_index" : "product", "_type" : "_doc", "_id" : "1", "_version" : 2, "result" : "updated", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 3, "_primary_term" : 1 }
替换方式有一个很差,替换时必须带上全部的fields,才能达到咱们想要的修改效果
举个例子,若是执行
PUT /product/_doc/1 { "name" : "jiaqiangban gaolujie yagao" } GET /product/_doc/1 { "_index" : "product", "_type" : "_doc", "_id" : "1", "_version" : 3, "_seq_no" : 4, "_primary_term" : 1, "found" : true, "_source" : { "name" : "jiaqiangban gaolujie yagao" } }
就不是咱们想要的了
四、修改商品:更新文档
格式
POST /{index}/_update/{id}
虽然本质仍是同样的,可是进行替换处理的操做所有放在了ES内部,咱们传输的数据只须要传须要修改的字段便可,大大下降了在批量处理时的网路带宽,提升了性能。
下面是展现的例子:
GET /product/_doc/1 { "_index" : "product", "_type" : "_doc", "_id" : "1", "_version" : 4, "_seq_no" : 5, "_primary_term" : 1, "found" : true, "_source" : { "name" : "jiaqiangban gaolujie yagao", "desc" : "gaoxiao meibai", "price" : 30, "producer" : "gaolujie producer", "tags" : [ "meibai", "fangzhu" ] } } POST /product/_update/1 { "doc":{ "name": "jiajieshi yagao" } } GET /product/_doc/1 { "_index" : "product", "_type" : "_doc", "_id" : "1", "_version" : 5, "_seq_no" : 6, "_primary_term" : 1, "found" : true, "_source" : { "name" : "jiajieshi yagao", "desc" : "gaoxiao meibai", "price" : 30, "producer" : "gaolujie producer", "tags" : [ "meibai", "fangzhu" ] } }
从这个例子就能够看出update操做成功了
五、删除商品:删除文档
格式:
DELETE /{index}/{type}/{id}
DELETE /product/_doc/1 { "_index" : "product", "_type" : "_doc", "_id" : "1", "_version" : 6, "result" : "deleted", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 7, "_primary_term" : 1 }