Elasticsearch學習系列二(基礎操作)
本文將分為3塊講解Es的基礎操作。分別為:索引(index)、映射(mapping)、文檔(document)。
索引操作
- 創建索引庫
語法:
PUT /索引名稱{
"settings":{
"屬性名":"屬性值"
}
}
settings:就是索引庫的設置,可以定義如分片數、副本數等等。不設置的話就是都走默認值。
示例:
PUT /test-demo
- 判斷索引是否存在
HEAD /索引名稱
- 查看索引
- 查看單個索引
GET /索引名稱
- 批量查看索引
GET /索引名稱1,索引名稱2
- 查看所有索引
GET _all
- 打開索引
POST /索引名稱/_open
- 關閉索引
POST /索引名稱/_close
- 刪除索引
DELETE /索引名稱
映射操作
索引創建之後,等於有了關係型數據庫中的database。Es7.x取消了索引type類型的設置,不能指定類型,默認為_doc,但是字段仍然是有的,我們需要設置字段的約束信息,叫做字段映射(mapping)。
字段的約束包括:
- 字段的數據類型
- 是否要存儲
- 是否要索引
- 分詞器等
- 創建映射字段
語法:
PUT /索引名/_mapping
{
"properties":{
"字段名":{
"type":"類型",
"index":true,
"store":true,
"analyzer":"分詞器"
}
}
}
- 字段名:根據需要任意填寫
- type:類型,可以是text(可分詞)、keyword(不可分詞)、long、short、date、integer、object
- index:是否索引,默認為true
- store:是否獨立存儲,默認為false。原始的文本會存儲在 _source 裏面,如果設置為true,則是獨立的存儲某個字段,獲取獨立存儲字段比從_source里解析快,但是更占空間。
- analyzer:指定分詞器,一般中文可以選擇ik_max_word、ik_smart
示例:
PUT /test-demo1/_mapping
{
"properties":{
"name":{
"type":"text",
"index":true,
"store":true,
"analyzer":"ik_max_word"
},
"job":{
"type":"text",
"analyzer":"ik_max_word"
},
"logo":{
"type":"keyword",
"index":false
}
,
"amt":{
"type":"double"
}
}
}
- 查看映射關係
- 查看某個索引
GET /索引名稱/_mapping
- 查看所有索引
GET _mapping
#或者
GET _all/_mapping
- 修改映射關係
這裡的修改指的是新增字段,其他更改不支持。只能刪除索引,重建映射
PUT /索引庫名/_mapping
{
"properties": {
"字段名": {
"type": "類型",
"index": true,
"store": true,
"analyzer": "分詞器"
}
}
}
- 一次性創建索引和映射
語法:
put /索引庫名稱
{
"settings":{
"索引庫屬性名":"索引庫屬性值"
},
"mappings":{
"properties":{
"字段名":{
"映射屬性名":"映射屬性值"
}
}
}
}
示例:
PUT /test-demo2
{
"settings":{},
"mappings": {
"properties": {
"name":{
"type":"text",
"analyzer": "ik_max_word"
}
}
}
}
文檔操作
文檔,即索引庫中的數據,會根據規則創建索引,將來用於搜索。可以類比做數據庫中的一行數據。
- 新增文檔
語法:
#自動生成id
POST /索引名稱/_doc
{
"field":"value"
}
#手動指定id
POST /索引名稱/_doc/1
{
"field":"value"
}
示例:
POST /test-demo1/_doc/1
{
"name":"百度",
"job":"運營",
"amt":"3000.34",
"logo":"//www.lgstatic.com/ttasdf2",
"createTime":"20220303230000"
}
- 查看單個文檔
GET /索引名稱/_doc/{id}
結果如下:
{
"_index" : "test-demo1",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 2,
"found" : true,
"_source" : {
"name" : "百度",
"job" : "運營",
"amt" : "3000.34",
"logo" : "//www.lgstatic.com/ttasdf2",
"createTime" : "20220303230000"
}
}
元數據項 | 含義 |
---|---|
_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。任何類型的寫操作,包括index、create、update和Delete,都會生成一個_seq_no。 |
_primary_term | 當Primary Shard發生重新分配時,比如重啟,Primary選舉等,_primary_term會遞增1。_primary_term主要是用來恢複數據時處理當多個文檔的_seq_no一樣時的衝突,避免Primary Shard上的寫入被覆蓋 |
found | true/false,是否查找到文檔 |
_source | 存儲原始文檔 |
- 查看所有文檔
POST /test-demo1/_search
{
"query":{
"match_all": {}
}
}
- 僅查詢部分字段
GET /test-demo1/_doc/1?_source=name,job
- 更新文檔(全部更新)
PUT /test-demo1/_doc/1
{
"name":"百度3",
"job":"運營",
"amt":"3000.34",
"logo":"//www.lgstatic.com/ttasdf2",
"createTime":"20220303230000"
}
為什麼說是全部更新呢?如果你只傳了name,其他filed不傳。那麼文檔里就只剩name了。
注意:Elasticsearch執行更新操作的時候,Elasticsearch首先將舊的文檔標記為刪除狀態,然後添加新的文檔,舊的文檔不會立即消失,但是你也無法訪問,Elasticsearch會在你繼續添加更多數據的時候在後台清理已經標記為刪除狀態的文檔。
全部更新,是直接把之前的老數據,標記為刪除狀態,然後,再添加一條更新的(使用PUT或者POST)
- 更新文檔(部分更新)
POST /索引名稱/_update/{id}
{
"doc":{
"field":"value"
}
}
- 刪除文檔
- 根據id刪除
DELETE /索引名稱/_doc/{id}
- 根據查詢條件刪除
POST /索引名稱/_delete_by_query
{
"query":{
"match":{
"字段名":"搜索關鍵字"
}
}
}
- 刪除所有文檔
POST /索引名稱/_delete_by_query
{
"query":{
"match_all":{}
}
}
- 文檔強制創建
本來如果不存在會創建,存在會更新。強制創建就是僅創建,不更新。已存在就報錯。
PUT /索引名稱/_doc/{id}?op_type=create
{
"filed":"value"
}