ElasticSearch(三)簡單的增刪改查

今天咱們來說一下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真難用!

相關文章
相關標籤/搜索