ElasticSearch index、mapping、document


 

ES中的幾個概念

  • 索引 index

相當於關系數據庫中的數據庫

 

  • 類型 type

相當於關系數據庫中的表
ES 5.x中⼀個index可以新建多個type
ES 6.x中⼀個index中只能新建⼀個type
ES 7.x中只能使用內置的_doc,不能自己新建type

  

  • 映射 mapping

定義每個字段的類型等信息,相當於關系數據庫中的表結構

 

  • 字段 field

相當於關系數據庫表的字段

 

  • ⽂檔 document

相當於關系數據庫中的⼀條記錄

 

  • 分⽚ shard

集群之后,每個節點存儲index的一部分,這一部分叫做一個分片。
分片有主副之分,副本分⽚(replica Shard)是主分⽚(primary Shard)的備份,當主分片故障之后,可以使用福分片代替。

 

 

 

ES中常用的請求方式

ES使用的的是RESTful風格的api。

 

 POST主要用於新建,更新、刪除也可以;

PUT主要用於更新,新建也可以。

 

 

 

ES常用的調試方式

  • Postman  十分好用,推薦
  • curl命令   這個命令在Linux、Windows命令行都可以使用
#查詢集群狀態,如果要查詢index、document,后面加/接着寫就行了
#DELETE的用法類似
curl -X GET http://192.168.1.9:9200


#帶數據,-H是設置header,-d是設置data
#PUT用法類似
curl -X POST http://192.168.1.9:9200/xxx/xxx/xxx" -H 'Content-Type:
application/json' -d'
{
 "xxx" : "xxx",
 "xxx" : "xxx"
}

-X可以省略,http://也可以省略。

 

 

 

索引操作

#新建一個index
PUT 192.168.1.9:9200/mall

#同時操作多個index,逗號隔開
PUT 192.168.1.9:9200/mall,student

#同時操作所有index
PUT 192.168.1.9:9200/_all

#把PUT換為GET就是查詢,換為DELETE就是刪除


#以上返回的均是json,查看所有index的信息也可以這樣
#indices是index的復數,?v會顯示項的名稱
GET 192.168.1.9:9200/_cat/indices?v


#查看指定的index是否存在
#如果返回的狀態碼是200 OK,表示該index存在;404 Not Found表示該index不存在
#雖說GET也可以根據返回的內容來判斷,但GET要獲取index的具體信息,速度慢一些
HEAD 192.168.1.9:9200/mall


#關閉索引
#如果不使用某個index,又不想刪除它,可以關閉它
#返回的該index信息中只有一個字段“closed”:true
POST 192.168.1.9:9200/mall/_close

#打開索引。關閉之后需要打開,才能繼續使用此index
#closed字段沒了
POST 192.168.1.9:9200/mall/_open

#關閉和打開都是更新操作,所以用的是POST

 

 

 

映射操作

#新建mapping,這種帶_的都是ES中預定義的。PUT也可換為POST,很多時候PUT、POST可以混用
PUT 192.168.1.9:9200/mall/_mapping
#在Body->raw->JSON中添加參數,keyword是關鍵字字段,text是普通文本字段
{
 "properties": {
    "goods_name": {
        "type": "keyword"
    },
    "goods_price": {
        "type": "float"
    },
    "goods_description": {
        "type": "text"
    }
 }
}



#也可以在創建index時就指定mapping
PUT 192.168.1.9:9200/mall

 {
  "mappings": {
    "properties": {
      "goods_name": {
        "type": "text"
      },
      "goods_price": {
        "type": "float"
      },
      "goods_description": {
        "type": "text"
      }
    }
  }
 }



#查詢mapping GET
192.168.1.9:9200/mall/_mapping #同時查詢多個index的mapping,逗號分隔index GET 192.168.1.9:9200/mall,student/_mapping #增加字段。新增是在原有的mapping上修改,使用POST POST 192.168.1.9:9200/mall/_mapping #在body中添加要增加的字段 { "properties": { "category":{ "type":"keyword" }, "stock":{ "type":"keyword" } } } #mapping中只能增加字段,不能修改已存在的字段

 

 

 

文檔操作


#####增#######

#添加一個document,需要用一個唯一的id來標識此document #6.x還可以自己新建一個type,7.x只能使用內置的_doc,不能自己新建type PUT 192.168.1.9:9200/mall/_doc/1 { "goods_name":"蘋果", "goods_price":10.00, "goods_description":"新鮮蘋果,10元一斤" }
#不用傳遞所有的字段
#如果沒有設置mapping就直接添加document,添加第一個document時會自動根據body中的字段值來創建mapping,自動創建的mapping可能不符合我們的需求,盡量手動創建mapping


#添加一個document可以不指定id,不指定id時ES會自動生成一個唯一的id #這時不是新增文檔,而是修改內置的_doc,所以要用POST POST
192.168.1.9:9200/mall/_doc { "goods_name":"芒果", "goods_price":6.00, "goods_description":"香甜芒果,6元一斤" }



#如果返回的數據中沒有"action.auto_create_index":"false",說明這個字段是true,自動創建索引是開啟的
GET 192.168.1.9:9200/_cluster/settings
#如果自動創建索引是開啟的,創建文檔時,如果索引不存在,會先自動創建索引
PUT 192.168.1.9:9200/mall/_doc/1



#新建文檔時,如果文檔已存在會覆蓋原來的文檔,可以加參數?op_type=create,僅創建,如果文檔已存在則不作任何操作
PUT localhost:9200/nba/_doc/1?op_type=create
{
"goods_name":"芒果",
"goods_price":6.00,
"goods_description":"香甜芒果,6元一斤"
}



####查#### #查詢一個document GET 192.168.1.9:9200/mall/_doc/1


#同時查詢多個文檔。因為要在body中傳遞數據,用POST
POST localhost:9200/_mget
#對象數組,這些文檔可以是不同的index中的

 {
  "docs" : [
    {
    "_index" : "mall",
    "_type" : "_doc",
    "_id" : "1"
    },
    {
    "_index" : "mall",
    "_type" : "_doc",
    "_id" : "2"
    }
  ]
 }

 

 

 #如果指定了index,那就只能是這個index中的文檔,body中不用指定index

 #POST 192.168.1.9:9200/mall/_mget

{
  "docs" : [
    {
    "_type" : "_doc",
    "_id" : "1"
    },
    {
    "_type" : "_doc",
    "_id" : "2"
    }
  ]
}



 #如果指定了index、type,那就只能是這個index、type中的文檔,body中不用指定index、type

 #POST 192.168.1.9:9200/mall/_doc/_mget

{
  "docs" : [
    {
    "_id" : "1"
    },
    {
    "_id" : "2"
    }
  ]
}

#body也可以這樣寫
{
  "ids" : ["1", "2"]
}




####改####

#修改整個文檔
POST 192.168.1.9:9200/mall/_doc/1

  {
  "goods_name": "蘋果",
  "goods_price": 16.0,
  "goods_decription":""
  }

#此種方式是先刪除原文檔,再寫入,就算只修改文檔某個字段的值,都需要傳入所有的字段,很麻煩
#如果要用這種方式,不要一個字段一個字段地敲,先GET查詢此文檔,把_source里的字段復制粘貼到body中去改




#修改|添加文檔的多個字段
POST 192.168.1.9:9200/mall/_update/1
#上面查詢多個文檔,用的復數docs,這里修改單個文檔,用單數doc

 {
  "doc": {
  "goods_price": 16.0,
  "goods_description":"..."
   }
  }

 #這種方式只修改指定的字段,如果之前該字段不存在,會自動添加該字段




#修改|添加文檔的單個字段
POST 192.168.1.9:9200/mall/_update/1

 {
  "script": "ctx._source.goods_price = 18"
 }

  #ctx是context 上下文。上面的值18是數值型,如果是字符串要加單引,或者\"轉義

 #如果該字段不存在,會自動添加

 

 

  #移除文檔的某個字段。將上面的body改一下即可

 {
   "script": "ctx._source.remove('goods_description')"
  }



  #可以使用參數

 POST 192.168.1.9:9200/mall/_update/1

 {
  "script": {
    "source": "ctx._source.goods_price = params.increment",
    "params":{
      "price":15.0
    }
  }
 }

 

 #可以進行數學運算,比如  ctx._source.goods_price += params.increment

 

 

 #更新文檔時如果文檔不存在,不報錯,可以加一個upsert字段,如果指定的文檔不存在,會先自動創建該文檔

 POST 192.168.1.9:9200/mall/_update/3

 {

  "script": {
    "source": "ctx._source.goods_price = params.increment",
    "params":{
      "increment":15.0
    }
  },
  "upsert":{

  }
}

 

#upsert,即update的前部+insert的后部,insert有2層含義:1、更新文檔時如果文檔不存在,會自動往索引中插入該文檔;2、在upsert中可以插入一些字段,創建該文檔后初始化字段

  "upsert":{
    "goods_price":0.0,

    "goods_description":""
  }

#比如說操作是goods_price+=increment,創建文檔后需要給它初始化,才+得上去,不然默認值是null,將null和一個值相加會報錯。

#如果只是=賦值操作,倒不用初始化

 

 

 

 ####刪####

 #刪除一個文檔

 DELETE 192.168.1.9:9200/mall/_doc/1

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM