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