elasticsearch和kibana都已經安裝和啓動了,下就開始進行實戰了node
首先來說一下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)對數據進行簡單的聚合分析性能
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
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
建立索引.net
PUT /test_index?pretty { "acknowledged" : true, "shards_acknowledged" : true, "index" : "test_index" }
刪除索引
DELETE /test_index?pretty { "acknowledged" : true }
一、新增商品:新增文檔,創建索引
格式
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 }