今天咱們來說一下ES的增刪改查,這塊內容有助於理解下週的SpringBoot集成ES的代碼。測試
首先,咱們先建立一個索引estest的索引,接下來要是都截圖的話,閱讀流暢性過低了,因此接下來會用簡寫的形式[請求類型 URL]。以下圖。將簡寫爲spa
PUT localhost:9200/estest RqeustBody: { "settings": { "number_of_shards": 1 }} ResponseBody: { "acknowledged": true, "shards_acknowledged": true, "index": "estest" }
而後咱們向一個user的類型中添加一條數據。方式一,是讓ES自動建立一個ID主鍵,若是咱們要使用咱們本身的主鍵,能夠看看第二種方法。3d
方法一: POST localhost:9200/estest/user/ RqeustBody: { "name": "張三", "age": 17, "name_and_age": "張三17", "is_man": true, "birthday": "2019-01-01" } ResponseBody: { "_index":"estest", "_type":"user", "_id":"-plY_HABLAPQJei9q-lc", //返回ID 重點 "_version":1, "result":"created", "_shards":{ "total":2, "successful":1, "failed":0 }, "_seq_no":0, "_primary_term":1 } 方法二: POST localhost:9200/estest/user/1 //重點,後面帶來一個id值 RqeustBody: { "name": "李四", "age": 17, "name_and_age": "李四17", "is_man": true, "birthday": "2019-01-01" } ResponseBody: { "_index": "estest", "_type": "user", "_id": "1", //返回ID 重點 "_version": 1, "result": "created", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "_seq_no": 1, "_primary_term": 1 }
如今要刪除李四這我的。咱們使用DELETE請求,在索引和類型後面加ID就完事兒了。code
DELETE localhost:9200/estest/user/1
可是,若是咱們要刪除指定名字的數據,好比說咱們要刪除張三的數據,可使用下面的請求。blog
POST localhost:9200/estest/user/_delete_by_query RqeustBody: { "query": { "match": { "name": "張三" } } }
咱們再次插入張三的數據。如今想更新一下張三的年齡,可使用方法一,在索引和類型的後面加上_update_by_query,再在裏添加查詢條件。。想方法二是根據ID更新數據。索引
方法一: POST localhost:9200/estest/user/_update_by_query RequestBody: { "script": { "source":"ctx._source.age=18;" }, "query": { "match": { "name":"張三" } } } 方法二 POST localhost:9200/estest/user/_5lp_HABLAPQJei9cuke RequestBody: { "birthday": "2019-01-01", "name_and_age": "張三17", "name": "張三", "is_man": true, "age": 18 }
終於,增刪改結束,雖然只是介紹了一下簡單的用法,我感受已經累的不行了,嗎呀,這個查詢纔是重點,可惡。ip
咱們如今要查詢張三這個用戶,要咋查呢?ci
GET localhost:9200/estest/user/_search RequestBody: { "query": { "match": { "name":"張三" } } }
好了,重點終於,match,match啊。match的意思是匹配的意思,這個頗有意思,由於ES裏面有一個分詞器,能夠模糊匹配,如今咱們放入一些其餘的張三數據。能夠看到名字爲張三123123的匹配程度最低,只有0.12多,其餘的爲0.15。文檔
那咱們要是想精確匹配,可使用trim。上一段介紹了一下分詞系統,因爲一開始沒有給索引創建映射,ES自動把name字段進行了分詞,致使咱們沒法精確匹配名字爲張三的數據。因此改用age來測試term,雖然用match也會有同樣的效果。match和term從文檔上看,沒啥子區別,match的適用範圍更加廣一些。源碼
GET localhost:9200/estest/user/_search RequestBody: { "query": { "match": { "age": 18 } } }
如今查詢一下年齡大於15歲的人。因爲是使用請求體的形式,因此不能用<,<=,>=,>這些符號,因此用這些來替代符號。
gt |
大於 |
gte |
大於等於 |
lt |
小於 |
lte |
小於等於 |
GET localhost:9200/estest/user/_search RequestBody: { "query": { "range": { "age":{ "gt": 15 } } } }
若是想查詢一個字段是否爲空,可使用exists。missing在 ES5中已經被移除了。
GET localhost:9200/estest/user/_search RequestBody: { "query": { "missing": { "field": "age" } } }
終於寫完了,這個ES的查詢花了我兩個晚上的時間,原本想週三的時候寫完,而後今天看一下Spring Security源碼,分析一下的,估計要拖到下週三了,我在這裏罵一句DSL真難用!