五、Elasticsearch快速入門案例(1)-CRUD
1、document資料格式
2、簡單的叢集管理
3、商品的CRUD操作(document CRUD操作)
1、document資料格式
面向文件的搜尋分析引擎
(1)應用系統的資料結構都是物件導向的,複雜的。
(2)物件資料儲存到db中,只能拆解開來,變為扁平的多張表,每次查詢的時候還得還原回物件格式,相當麻煩。
(3)ES是面向文件的,文件中儲存的資料結構,與物件導向的資料結構是一樣的,基於這種文件資料結構,ES可以提供複雜的索引,全文檢索,分析聚合等功能。
(4)ES的document用JSON資料格式來表達。
1.1對比:
Java寫法:
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; // 興趣愛好
}
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類自己的屬性,還有一個EmployeeInfo物件
兩張表: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面向文件寫法:
{
"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"
}
2、簡單的叢集管理
(1)快速檢查叢集的健康狀況
es提供了一套api,叫做cat api,可以檢視es中各種各樣的資料GET /_cat/health?v
(2)如何快速瞭解叢集的健康狀況?
有三種狀態:green、yellow、red
green:每個索引的primary shard和replica shard都是active狀態的
yellow:每個索引的primary shard都是active狀態的,但是部分replica shard不是active狀態,處於不可用的狀態
red:不是所有索引的primary shard都是active狀態的,部分索引有資料丟失了
問:為什麼現在會處於一個yellow狀態,而不是green?
答:我們現在就一個膝上型電腦,就啟動了一個es程式,相當於只有一個node節點,現在es中有一個index索引,就是kibana自己內建建立的index,由於預設的shard不能再同一臺機器上(為了容錯)。現在kibana自己建立的index是1個primary shard和1個replica shard(注意這裡不是5個,kibana預設就1個,es預設5個)。當前就一個node,所以只有一個primary shard被分配了和啟動了,但是一個replica shard沒有第二臺機器去啟動,所以active_shards_percent是50%,狀態是yellow。
做個試驗驗證問答
此時只要啟動第二個es程式,就會在es叢集中有2個node,然後那1個replica shard就會自動分配過去,然後cluster status就會變成green狀態。
對比兩次結果,第一次yellow,50%,當我再次啟動一個es的時候,結果變成了green,100%
(3)快速檢視叢集中有哪些索引GET /_cat/indices?v
只有一個index,名稱為.kibana
(4)簡單的索引操作
(4.1)建立索引PUT /test_index?pretty
再次檢視GET /_cat/indices?v
(4.2)刪除索引DELETE /test_index?pretty
3、商品的CRUD
(1)新增商品,新增文件,建立索引(es自動建立索引)
格式:
PUT /index/type/id
{
"json資料"
}
案例:
PUT /ecommerce/product/1
{
"name" : "gaolujie yagao",
"desc" : "gaoxiao meibai",
"price" : 30,
"producer" : "gaolujie producer",
"tags": [ "meibai", "fangzhu" ]
}
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" ]
}
返回結果:
{
"_index": "ecommerce", //索引名稱
"_type": "product", //type名稱
"_id": "1", //類似db的行號(主鍵id)
"_version": 1, //第一次被操作
"result": "created", //建立
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"created": true
}
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" ]
}
返回結果
{
"_index": "ecommerce",
"_type": "product",
"_id": "1",
"_version": 2, //新增是第一次操作,現在update,所以是兩次操作,是2
"result": "updated", //create變成了update
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"created": false //新增是true,編輯是false
}
替換方式有一個不好,即使必須帶上所有的field,才能去進行資訊的修改
比如如下只寫個name屬性是不行的:
PUT /ecommerce/product/1
{
"name" : "jiaqiangban gaolujie yagao"
}
(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
}
}
(5)刪除商品:刪除文件
DELETE /ecommerce/product/1
返回結果:
{
"found": true,
"_index": "ecommerce",
"_type": "product",
"_id": "1",
"_version": 9,
"result": "deleted",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
}
}
若有興趣,歡迎來加入群,【Java初學者學習交流群】:458430385,此群有Java開發人員、UI設計人員和前端工程師。有問必答,共同探討學習,一起進步!
歡迎關注我的微信公眾號【Java碼農社群】,會定時推送各種乾貨:
相關文章
- Elasticsearch(1):基礎入門Elasticsearch
- Elasticsearch快速入門和環境搭建Elasticsearch
- Julia快速入門(1)
- MongoDB 新手入門 - CRUDMongoDB
- Elasticsearch和向量資料庫的快速入門Elasticsearch資料庫
- Elasticsearch CRUD基本操作Elasticsearch
- ElasticSearch 入門Elasticsearch
- (CMake):CMake安裝及快速入門案例
- GraphQL 快速入門【1】簡介
- Zend Framework 入門(1)—快速上手Framework
- 從安裝到入門:ElasticSearch 快速學習手冊Elasticsearch
- Elasticsearch入門教程Elasticsearch
- Elasticsearch 入門使用Elasticsearch
- elasticsearch 入門篇Elasticsearch
- Maven快速入門(五)Maven的依賴管理Maven
- 【Spring Security】1.快速入門Spring
- ElasticSearch實戰系列六: Logstash快速入門和實戰Elasticsearch
- Elasticsearch核心技術(二):Elasticsearch入門Elasticsearch
- 搭建推薦系統快速入門,只需五步!
- 小豬的C語言快速入門系列(五)C語言
- camunda快速入門(五):DMN規則引擎如何使用
- Elasticsearch 基礎入門Elasticsearch
- ElasticSearch基礎入門Elasticsearch
- ElasticSearch入門檢索Elasticsearch
- ElasticSearch 入門簡介Elasticsearch
- Elasticsearch(windows)使用入門ElasticsearchWindows
- Elasticsearch 極簡入門Elasticsearch
- ElasticSearch入門簡介Elasticsearch
- ElasticSearch實戰-入門Elasticsearch
- 我的Elasticsearch入門Elasticsearch
- ThinkPHP3.2 快速入門(1)基礎PHP
- Thinkphp5.0快速入門筆記(1)PHP筆記
- JavaScript學習筆記1—快速入門JavaScript筆記
- Sahi (1) —— 快速入門(101 Tutorial)
- ElasticSearch核心概念和文件的CRUDElasticsearch
- Elasticsearch——叢集管理及文件CRUDElasticsearch
- 快速排序快速入門排序
- CSS快速入門基礎篇,讓你快速上手(附帶程式碼案例)CSS