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存在則會報錯