elasticsearch學習筆記(五)——快速入門案例實戰電商網站商品管理:集羣健康檢查,文檔的CRUD

elasticsearch和kibana都已經安裝和啓動了,下就開始進行實戰了node

一、document數據格式

首先來說一下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)對數據進行簡單的聚合分析性能

三、簡單的集羣管理

(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參數值便可ui

  • 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)簡單的索引操做

建立索引.net

PUT /test_index?pretty

{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "test_index"
}

刪除索引

DELETE /test_index?pretty

{
  "acknowledged" : true
}

(4)商品的CRUD操做

一、新增商品:新增文檔,創建索引
格式

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
}
相關文章
相關標籤/搜索