1. 程式人生 > >Elasticsearch中的document資料格式,簡單的叢集管理,商品的索引的CRUD操作(學習資料記錄)

Elasticsearch中的document資料格式,簡單的叢集管理,商品的索引的CRUD操作(學習資料記錄)

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("[email protected]"); employee.setFirstName("san"); employee.setLastName("zhang"); employee.setInfo(info); employee.setJoinDate(new Date());

從上面可以知道在Employee的表中含有info的資訊。如果是在ES中,我們需要封裝出如下的結構:

{
    "email"        :   "[email protected]",
    "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"]
}

相關推薦

Elasticsearchdocument資料格式簡單叢集管理商品索引CRUD操作學習資料記錄

1、Document資料格式 面向文件的搜尋分析引擎 (1)應用系統的資料結構都是面向物件的,複雜的。 (2)物件資料儲存到資料庫中,只能拆解開來,變為扁平的多張表,每次查詢的時候還得還原回物件格式,相當麻煩。 **(3)**ES是面向文件的,文件中儲存

Java學習——方法傳遞參數分簡單類型與復雜類型引用類型編程計算100+98+96+。。。+4+2+1的值用遞歸方法實現

dig oid 傳遞 system alt style 類型 遞歸 gen package hello; public class digui { public static void main(String[] args) { /

Elasticsearchdocument的基礎知識

元數據 不同 一個 返回 document elastics nbsp test 唯一標識 寫在前面的話:讀書破萬卷,編碼如有神-------------------------------------------------------------------- 參考內容

資料之scala --- 安裝scala簡單語法介紹條件表示式輸入和輸出迴圈函式過程lazy 異常陣列

一、安裝和執行Scala解釋程式 --------------------------------------------- 1.下載scala-2.11.7.msi 2.管理員執行--安裝 3.進入scala/bin,找到scala.bat,管理員執行,進入scala命

MacPython版本隨意切換終極指南簡單到爆什麼都不用設定

很多人為了Mac自帶Python和自己下載的Python衝突發生煩惱,我一開始也很煩惱,現在徹底搞定了,這篇文章就是解決這個困擾而設定的。 這篇文章是繼這篇文章後總結出的 簡單3步成功給Mac安裝指定Python版本和指定庫版本並且隨意切換版本,非常簡單,不行拿磚砸我 https:/

Vue資料視覺化元件庫類阿里DataV提供SVG的邊框及裝飾圖表飛線圖等元件簡單易用持續更新

由於阿里DataV收費,介面維護略有麻煩,同時也基於興趣和學習,自己從依賴到元件獨立開發了一個元件庫,從效果上跟阿里的DataV很

js陣列常用方法的簡單重構(部分)幫助你加快理解陣列常用方法

## `push` 將指定數字插入到陣列的末尾,返回值為`新陣列的長度` ```javascript //原方法示例: var ary = [1, 2, 3, 4, 5]; ary.length = 5; ary.push(1) ; ary = [1,2,3,4,5,1

如今的iOS開發者優勝劣汰如何提升讓自己不被淘汰?資料

角度 高效 二進制 新的 編輯器 選擇 形勢 前端工程 作者 序言: 如果從 13 年移動客戶端大火開始算起,至今已經有五個年頭了。現在移動端的形勢也不需要太多的廢話來描述,一句話總結就是:“浪潮退去,誰在裸泳一看就清楚。”我希望借助這篇文章來聊聊在我心目中,移動互聯網下一

5個Excel序號填充技巧簡單明了即學即用

工作 dff 今天 圖片 合並 分享圖片 nta ima 選擇 由於工作需要,經常都要用到Excel序號填充,於是就整理了5個比較常用的Excel序號填充技巧,分享給大家,需要的朋友建議收藏一份,方法簡單,即學即用! 自然序號填充 方法:選中你需要填充的區域,輸入公式=

Log4j配置Log4j叢集配置Log4j Weblogic叢集配置

Log4j配置,Log4j叢集配置,Log4j Weblogic叢集配置     ================================ ©Copyright 蕃薯耀 2018年10月19日 http://fanshuyao.iteye.com/  

springSecurity的學習筆記--使用spring-Security完成“記住我”單機session管理叢集session管理登出

   今天課外的大部分空餘時間都用來了整理springSecurity練習的筆記。 整理了一部分,還差一些這裡補上! 記住我功能要素:       springsecurity提供了一個記住我的功能。  它的大致原理是,攔截器檢測是

工廠模式簡單工廠模式抽象工廠模式

說到這幾個工廠模式有很多相似之處又有不同。最重要的是掌握這種思想,在以後搭建專案架構或寫一些功能,應用這些思想,讓自己的程式更健壯,或者說當你看到別人寫的程式應用到了這種思想能夠快速理解。話不多說,咱們先從入門級的小案例講起。 一.簡單工廠模式 基本概念:簡單工廠模式是由一個工廠類根據接受到的訊息決定要建

一起來學大資料|Spring的事務管理一分錢也不能少

  之前我們講過spring是一站式框架,我們已經學習了spring框架簡單的資料操作。今天我們一起來看看spring針對dao層提供的解決技術jdbcTemplate。我們直接以銀行轉賬為例,完成我們資料庫的連線和事務管理。 JdbcTemplate 1、準備工作

Kubernetes 1.13釋出:利用Kubeadm簡化叢集管理CSI以及作為預設DNS的CoreDNS全面實現普遍可用...

我們很高興地公佈Kubernetes 1.13版本,這是我們2018年年內第四次也是最後一次釋出新的版本! Kubernetes 1.13是迄今為止釋出間隔最短的版本之一,距離上一次迭代僅為十週。此版本繼續關注Kubernetes的穩定性與可擴充套件性,其中儲存與叢集生命週期相

[C#原始碼]網路資料流讀寫封裝類支援多執行緒下同時讀和寫自動資源管理字串分隔符\r\n

using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using Syst

資料結構——入棧出棧佇列相關操作C語言實現

閱讀過程之中可能會花費比較多的時間:建議直接翻到最後,有完整的程式碼可以使用 程式準備工作 #include <stdio.h> #include <malloc.h> #include <stdlib.h> #include<proc

Android控制手電筒程式碼簡單易用不需要任何許可權

1.控制手電筒開關的工具類:public class FlashUtils { private CameraManager manager; private Camera mCamera = null; private Context context;

新菜redis叢集安裝單機6節點3主3從

# 2、解壓、編譯、安裝# 編譯需要用到gcc,自己可用:rpm -qa | grep gcc ,檢視是否安裝gcc,沒有自行百度補腦# 解壓tar -zxvf redis-3.0.0.tar.gz -C /usr/local/# 重新命名(如果嫌名字太長,可重新命名,我這裡就改一下)mv /usr/loca

排序演算法氣泡排序簡單選擇排序直接插入排序希爾排序

氣泡排序,簡單選擇排序,直接插入排序是三種複雜度為O(n2)的演算法,希爾排序在特殊增量序列的時候可以獲得複雜度為O(n3/2) 氣泡排序 1、最簡單的排序實現 這裡把每個數和這個數之後的每個數比較,大於就交換位置。 缺點:多出了很多次沒有用的交

用SQLAlchemy例項物件來進行資料庫表資料的增刪改查操作db.session.xx

#encoding:utf-8 from flask import Flask from flask_sqlalchemy import SQLAlchemy import config app = Flask(__name__) app.config.from_obje