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("zhangsan@sina.com"); employee.setFirstName("san"); employee.setLastName("zhang"); employee.setInfo(info); employee.setJoinDate(new Date());從上面可以知道在Employee的表中含有info的信息。如果是在ES中,我們需要封裝出如下的結構:
{"email" : "zhangsan@sina.com","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
(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)快速查看集群中有哪些索引
(5)簡單的索引操作
創建索引:PUT /test_index?pretty
執行完成之后,返回結果:
查看索引:
GET /_cat/indices?v
從上面可以看出增加了一個test_index索引。
(6)刪除索引
DELETE /test_index?pretty
運行后返回的結果集是:
再次查詢結果,結果如下:
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.1kb4、商品的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操作(学习资料记录)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何炒羊肉肝子?
- 下一篇: 华夏信用卡取现额度是多少