ES入門三部曲:索引操作,對映操作,文件操作
一、索引操作
1.建立索引庫
#語法
PUT /索引名稱
{
"settings": {
"屬性名": "屬性值"
}
}
#示例
PUT /es_index
說明:settings是索引庫的設定,可以定義各種屬性,一般可以不填寫,直接走預設。
2.判斷索引是否存在
#語法
HEAD /索引名稱
#示例
HEAD /es_index
3.檢視索引
# 語法
GET /索引名稱
# 示例
GET /es_index
# 批量檢視索引
GET /索引名稱1,索引名稱2,索引名稱3,...
# 檢視所有索引
GET _all || GET /_cat/indices?v
4.開啟索引
# 語法
POST /索引名稱/_open
# 示例
POST /es_index/_open
5.關閉索引
# 語法
POST /索引名稱/_close
# 示例
POST /es_index/_close
6.刪除索引庫
# 語法
DELETE /索引名稱1,索引名稱2,索引名稱3...
二、對映操作
索引建立後,等於有了關係型資料庫中的database。Elasticsearch7.x取消了索引type型別的設定,不允許指定型別,預設為_doc,但欄位仍然是有的,我們需要設定欄位的約束資訊,叫做欄位對映(mapping)
欄位的約束包括但不限於:
- 欄位的資料型別
- 是否要儲存
- 是否要索引
- 分詞器
1.建立對映欄位
語法
PUT /索引庫名/_mapping
{
"properties": {
"欄位名": {
"type": "型別",
"index": true,
"store": true,
"analyzer": "分詞器"
}
}
}
欄位名:任意填寫,下面指定許多屬性,例如:
- type:型別,可以是text、long、short、date、integer、object等
- index:是否索引,預設為true
- store:是否儲存,預設為false
- analyzer:指定分詞器
示例
PUT /es_index/_mapping/
{
"properties": {
"name": {
"type": "text",
"analyzer": "ik_max_word"
},
"job": {
"type": "text",
"analyzer": "ik_max_word"
},
"logo": {
"type": "keyword",
"index": "false"
},
"payment": {
"type": "float"
}
}
}
2.對映屬性詳解
1.type
我們說幾個關鍵的:
-
String型別,又分兩種:
- text:可分詞,不可參與聚合
- keyword:不可分詞,資料會作為完整欄位進行匹配,可以參與聚合
-
Numerical:數值型別,分兩類
- 基本資料型別:long、interger、short、byte、double、float、half_float
- 浮點數的高精度型別:scaled_float
- 需要指定一個精度因子,比如10或100。elasticsearch會把真實值乘以這個因子後儲存,取出時再還原。
-
Date:日期型別
elasticsearch可以對日期格式化為字串儲存,但是建議我們儲存為毫秒值,儲存為long,節省空間
-
Array:陣列型別
- 進行匹配時,任意一個元素滿足,都認為滿足
- 排序時,如果升序則用陣列中的最小值來排序,如果降序則用陣列中的最大值來排序
-
Object:物件型別
{name:"Amy",age:25,friend:{name: "DaMing", age:25}}
如果儲存到索引庫的是物件型別,例如上面的friend,會把friend變成兩個欄位:friend.name和friend.age
2.index
index影響欄位的索引情況。
-
true:欄位會被索引,則可以用來進行搜尋。預設值就是true
-
false:欄位不會被索引,不能用來搜尋
index的預設值就是true,也就是說你不進行任何配置,所有欄位都會被索引。
但是有些欄位是我們不希望被索引的,比如企業的logo圖片地址,就需要手動設定index為false。
3.store
是否將資料進行獨立儲存。
原始的文字會儲存在 source 裡面,預設情況下其他提取出來的欄位都不是獨立儲存的,是從
_source 裡面提取出來的。當然你也可以獨立的儲存某個欄位,只要設定store:true即可,獲取獨立存
儲的欄位要比從source中解析快得多,但是也會佔用更多的空間,所以要根據實際業務需求來設定,
預設為false。
4.analyzer:指定分詞器
一般我們處理中文會選擇ik分詞器 ik_max_word ik_smart
3.檢視對映關係
-
檢視單個索引的對映關係
# 語法GET /索引名稱/_mapping# 示例GET /es_index/_mapping
-
檢視所有索引的對映關係
# 語法GET _mapping 或者是 GET _all/_mapping
-
修改索引的對映關係
# 語法PUT /索引庫名/_mapping{"properties": {"欄位名": {"type": "型別","index": true,"store": true,"analyzer": "分詞器"}}}
注意:修改對映增加欄位 做其它更改只能刪除索引 重新建立對映
4.一次性建立索引和對映
除了建立索引和對映分開做,也可以一次性的建立好索引以及對映
# 語法put /索引庫名稱{"settings":{"索引庫屬性名":"索引庫屬性值"},"mappings":{"properties":{"欄位名":{"對映屬性名":"對映屬性值"}}}}# 示例PUT /es_index{"settings": {},"mappings": {"properties": {"name": {"type": "text","analyzer": "ik_max_word"}}}}
三、文件增刪改以及區域性更新
1.新增文件
-
新增文件(手動指定id)
# 語法POST /索引名稱/_doc/{id}# 示例POST /es_index/_doc/1{"name" : "zae","job" : "java開發","payment" : "1000","logo" :"http://www.lgstatic.com/thubnail_120x120/i/image/M00/21/3E/CgpFT1kVdzeAJNbUAABJB7x9sm8374.png"}
-
新增文件(自動生成id)
# 語法POST /索引名稱/_doc{"field":"value"}
在建立文件完成後,,在響應結果中有個 id 欄位,這個就是這條文件資料的 唯一標識 ,以後的
增刪改查都依賴這個id作為唯一標示,這裡是Elasticsearch幫我們隨機生成的id
2.檢視單個文件
-
語法示例
# 語法GET /索引名稱/_doc/{id}# 示例GET/es_index/_doc/1
-
文件後設資料解讀
- index :document所屬index
- _type: document所屬type,Elasticsearch7.x預設type為doc
- id :代表document的唯一標識,與index和type一起,可以唯一標識和定位一個document
- _version:document的版本號,Elasticsearch利用version (版本號)的方式來確保應用中相互衝突的變更不會導致資料丟失。需要修改資料時,需要指定想要修改文件的version號,如果該版本不是當前版本號,請求將會失敗
- _seq_no:嚴格遞增的順序號,每個文件一個,Shard級別嚴格遞增,保證後寫入的Doc的seq_no大於先寫入的Doc的seq_no
- primary_term:任何型別的寫操作,包括index、create、update和Delete,都會生成一個seq_no。
- found :true/false,是否查詢到文件
- _source 儲存原始文件
3.檢視所有文件
# 語法POST /索引名稱/_search{"query":{"match_all": {}}}
4._source定製返回結果
某些業務場景下,我們不需要搜尋引擎返回source中的所有欄位,可以使用source進行定製,如下,多
個欄位之間使用逗號分隔
# 示例GET /es_index/_doc/1?_source=name,job
5.更新文件(全部更新)
把新增的語法中請求方式改為PUT就是修改了,不過需要指定修改的id
# 語法PUT /索引名稱/_doc/{id}
- 對應的id存在,則為修改
- 對應的id不存在,則為新增
6.更新文件(區域性更新)
Elasticsearch可以使用PUT或者POST對文件進行更新(全部更新),如果指定ID的文件已經存在,則執行
更新操作。
注意:Elasticsearch執行更新操作的時候,Elasticsearch首先將舊的文件標記為刪除狀態,然後新增新
的文件,舊的文件不會立即消失,但是你也無法訪問,Elasticsearch會在你繼續新增更多資料的時候在
後臺清理已經標記為刪除狀態的文件。
全部更新,是直接把之前的老資料,標記為刪除狀態,然後,再新增一條更新的(使用PUT或者
POST)
局域更新,只是修改某個欄位(使用POST)
# 語法POST /索引名/_update/{id}{"doc":{"field":"value"}}
7.刪除文件
-
根據id進行刪除操作
# 語法DELETE /索引名/_doc/{id}
-
根據條件刪除
# 語法POST /索引庫名/_delete_by_query{"query": {"match": {"欄位名": "搜尋關鍵字"}}}# 示例:將name欄位為2的文件資料刪除POST /es_index/_delete_by_query{"query":{"match":{"name":"2"}}}
-
刪除所有文件
POST 索引名/_delete_by_query{"query": {"match_all": {}}}
8.文件的全量替換、強制建立
-
全量替換
- 語法與建立文件是一樣的,如果文件id不存在,那麼就是建立;如果文件id已經存在,那麼就是全量替換操作,替換文件的json串內容;
- 文件是不可變的,如果要修改文件的內容,第一種方式就是全量替換,直接對文件重新建立索引,替換裡面所有的內容,elasticsearch會將老的文件標記為deleted,然後新增我們給定的一個文件,當我們建立越來越多的文件的時候,elasticsearch會在適當的時機在後臺自動刪除標記為deleted的文件
-
強制建立
# 強制建立PUT /index/_doc/{id}?op_type=create {},PUT /index/_doc/{id}/_create {}# 注意,強制建立時,如果id存在則會報錯