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"]
}
相關推薦
Elasticsearch中的document資料格式,簡單的叢集管理,商品的索引的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) { /
Elasticsearch中document的基礎知識
元數據 不同 一個 返回 document elastics nbsp test 唯一標識 寫在前面的話:讀書破萬卷,編碼如有神-------------------------------------------------------------------- 參考內容
大資料之scala(一) --- 安裝scala,簡單語法介紹,條件表示式,輸入和輸出,迴圈,函式,過程,lazy ,異常,陣列
一、安裝和執行Scala解釋程式 --------------------------------------------- 1.下載scala-2.11.7.msi 2.管理員執行--安裝 3.進入scala/bin,找到scala.bat,管理員執行,進入scala命
Mac中Python版本隨意切換終極指南,簡單到爆,什麼都不用設定
很多人為了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