内容简介:elasticsearch和kibana都已经安装和启动了,下就开始进行实战了首先来讲一下ES为什么面向文档以及面向文档的好处。(1)一般应用系统的数据结构都是面向对象的,结构复杂,操作起来特别不方便。如果将对象数据存储到数据库中,只能拆解开来,变为扁平的多张表,每次查询的时候还得还原回对象格式,相当的麻烦。
elasticsearch和kibana都已经安装和启动了,下就开始进行实战了
1、document数据格式
首先来讲一下ES为什么面向文档以及面向文档的好处。
(1)一般应用系统的数据结构都是面向对象的,结构复杂,操作起来特别不方便。如果将对象数据存储到数据库中,只能拆解开来,变为扁平的多张表,每次查询的时候还得还原回对象格式,相当的麻烦。
(2)ES是面向文档的,文档中存储的数据结构,与面向对象的数据结构是一样的,基于这种文档的数据结构,es可以提供复杂的索引,全文检索,分析聚合等的功能。
(3)es的document底层是用json数据格式来表达的,json的优势就用说了,附上一篇文章来说明 https://blog.csdn.net/it_drea...
对象的数据结构:
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表
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数据格式和数据库的关系型数据库的区别
2、电商网站商品管理案例背景介绍
有一个电商网站,需要为其基于ES构建一个后台系统,提供以下功能:
(1)对商品信息进行CRUD(增删改查)操作
(2)执行简单的结构化查询
(3)可以执行简单的全文检索,以及复杂的phrase(短语)检索
(4)对于全文检索的结果,可以进行高亮显示
(5)对数据进行简单的聚合分析
3、简单的集群管理
(1)快速检查集群的健康状况
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参数值即可
- green: 每个索引的primary shard和replica shard都是active状态
- yellow: 每个索引的primary shard都是active状态,但是部分的replica shard不是active状态,处于不可用的状态
- red: 不是所有的索引的primary shard都是active状态,部分索引有数据的丢失
(2)快速查看集群中有哪些索引
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
(3)简单的索引操作
创建索引
PUT /test_index?pretty { "acknowledged" : true, "shards_acknowledged" : true, "index" : "test_index" }
删除索引
DELETE /test_index?pretty { "acknowledged" : true }
(4)商品的CRUD操作
1、新增商品:新增文档,建立索引
格式
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都建立倒排索引,让其可以被搜索
2、查询商品:检索文档
格式:
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" ] } }
3、修改商品:替换文档
格式:
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" } }
就不是我们想要的了
4、修改商品:更新文档
格式
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操作成功了
5、删除商品:删除文档
格式:
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 }
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- MongoDB 分片集群实战
- Docker实战之Consul集群
- Hadoop集群部署实战(cdh发行版)
- Hadoop集群部署实战(cdh发行版)
- 进阶的Redis之哈希分片原理与集群实战
- Elasitcsearch 7.X 集群/索引备份与恢复实战
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Clojure编程
Chas Emerick、Brian Carper、Christophe Grand / 徐明明、杨寿勋 / 电子工业出版社 / 2013-3-26 / 99.00元
Clojure是一种实用的通用语言,它是传奇语言LISP的方言,可与Ruby、Python等动态语言相媲美,更以无缝Java库、服务,以及拥有JVM系统得天独厚的资源优势而胜出。本书既可以用来熟悉Clojure基础知识与常见例子,也可了解其相关的实践领域与话题,更可以看到这一JVM平台上的LISP如何帮助消除不必要的复杂性,为大家在编程实践中解决最具挑战性的问题开辟新的选择——更具灵活性,更适于W......一起来看看 《Clojure编程》 这本书的介绍吧!