文章目錄
- 十一 、ElasticSearch 索引庫及文檔操作
- 11.5 索引庫操作
- 5.1 mapping映射屬性
- 5.2 索引庫的CRUD
- 5.2.1 建立索引庫和映射
- 5.2.2 查詢索引庫
- 5.2.3 修改索引庫
- 5.2.4 删除索引庫
- 5.2.5 總結
- 11.6 文檔操作
- 6.1 新增文檔
- 6.2 查詢文檔
- 6.3 删除文檔
- 6.4 修改文檔
- 6.4.1 全量修改
- 6.4.2 增量修改
- 6.5 總結
十一 、ElasticSearch 索引庫及文檔操作
11.5 索引庫操作
索引庫就類似資料庫表,mapping 映射就類似表的結構。我們要向 es中存儲資料,必須先建立“庫”和“表”。
5.1 mapping映射屬性
mapping
是對索引庫中文檔的限制,常見的mapping屬性包括:
- type:字段資料類型,常見的簡單類型有:
- 字元串:
(可分詞的文本)、text
(精确值,例如:品牌、國家、ip位址)keyword
- 數值:
、long
、integer
、short
、byte
、double
float
- 布爾:
boolean
- 日期:
date
- 對象:
object
- index:是否建立索引,預設為
true
- analyzer:使用哪種分詞器
- properties:該字段的子字段
例如下面的
json
文檔:
{
"age": 21,
"weight": 52.1,
"isMarried": false,
"info": "程式員Java講師",
"email": "[email protected]",
"score": [99.1, 99.5, 98.9],
"name": {
"firstName": "雲",
"lastName": "趙"
}
}
對應的每個字段映射(mapping):
- age:類型為 integer;參與搜尋,是以需要index為true;無需分詞器
- weight:類型為float;參與搜尋,是以需要index為true;無需分詞器
- isMarried:類型為boolean;參與搜尋,是以需要index為true;無需分詞器
- info:類型為字元串,需要分詞,是以是text;參與搜尋,是以需要index為true;分詞器可以用ik_smart
- email:類型為字元串,但是不需要分詞,是以是keyword;不參與搜尋,是以需要index為false;無需分詞器
- score:雖然是數組,但是我們隻看元素的類型,類型為float;參與搜尋,是以需要index為true;無需分詞器
- name:類型為object,需要定義多個子屬性
- name.firstName;類型為字元串,但是不需要分詞,是以是keyword;參與搜尋,是以需要index為true;無需分詞器
- name.lastName;類型為字元串,但是不需要分詞,是以是keyword;參與搜尋,是以需要index為true;無需分詞器
傳回頂部
5.2 索引庫的CRUD
5.2.1 建立索引庫和映射
基本文法
- 請求方式:
PUT
- 請求路徑:
,可以自定義/索引庫名
- 請求參數:
mapping映射
格式:
PUT /索引庫名稱
{
"mappings": {
"properties": {
"字段名":{
"type": "text",
"analyzer": "ik_smart"
},
"字段名2":{
"type": "keyword",
"index": "false"
},
"字段名3":{
"properties": {
"子字段": {
"type": "keyword"
}
}
},
// ...略
}
}
}
示例:
# 建立索引庫
PUT /zyx
{
"mappings": {
"properties": {
"info":{
"type": "text",
"analyzer": "ik_smart"
},
"email":{
"type": "keyword",
"index": false
},
"name":{
"type": "object",
"properties": {
"firstName": {
"type": "keyword"
},
"lastName": {
"type": "keyword"
}
}
}
}
}
}

傳回頂部
5.2.2 查詢索引庫
基本文法:
- 請求方式:GET
- 請求路徑:/索引庫名
- 請求參數:無
格式:
GET /索引庫名
示例:
傳回頂部
5.2.3 修改索引庫
反向索引結構雖然不複雜,但是一旦資料結構改變(比如改變了分詞器),就需要重新建立反向索引,這簡直是災難。是以索引庫一旦建立,無法修改mapping。
雖然無法修改mapping中已有的字段,但是卻允許添加新的字段到mapping中,因為不會對反向索引産生影響。
文法說明:
PUT /索引庫名/_mapping
{
"properties": {
"新字段名":{
"type": "integer"
}
}
}
示例:
傳回頂部
5.2.4 删除索引庫
文法:
- 請求方式:
DELETE
- 請求路徑:/索引庫名
- 請求參數:無
格式:
DELETE /索引庫名
在kibana中測試:
5.2.5 總結
索引庫操作
- 建立索引庫:
PUT /索引庫名
- 查詢索引庫:
GET /索引庫名
- 删除索引庫:
DELETE /索引庫名
- 添加字段:
PUT /索引庫名/_mapping
傳回頂部
11.6 文檔操作
6.1 新增文檔
文法:
POST /索引庫名/_doc/文檔id
{
"字段1": "值1",
"字段2": "值2",
"字段3": {
"子屬性1": "值3",
"子屬性2": "值4"
},
// ...
}
示例:
POST /zyx/_doc/1
{
"info": "程式員Java講師",
"email": "[email protected]",
"name": {
"firstName": "雲",
"lastName": "趙"
}
}
響應:
傳回頂部
6.2 查詢文檔
根據
rest風格
,新增是
post
,查詢應該是
get
,不過查詢一般都需要條件,這裡我們把
文檔id
帶上。
文法:
GET /{索引庫名稱}/_doc/{id}
通過kibana檢視資料:
GET /zyx/_doc/1
檢視結果:
傳回頂部
6.3 删除文檔
删除使用
DELETE
請求,同樣,需要根據
id
進行删除:
文法:
DELETE /{索引庫名}/_doc/id值
示例:
# 根據id删除資料
DELETE /zyx/_doc/1
結果:
傳回頂部
6.4 修改文檔
修改有兩種方式:
- 全量修改:直接覆寫原來的文檔
- 增量修改:修改文檔中的部分字段
6.4.1 全量修改
全量修改是覆寫原來的文檔,其本質是:
- 根據指定的
删除文檔id
- 新增一個相同
的文檔id
注意:如果根據
id
删除時,
id
不存在,第二步的新增也會執行,也就從修改變成了新增操作了。
文法:
PUT /{索引庫名}/_doc/文檔id
{
"字段1": "值1",
"字段2": "值2",
// ... \略
}
示例:
PUT /zyx/_doc/1
{
"info": "程式員進階MySQL講師",
"email": "[email protected]",
"name": {
"firstName": "雲",
"lastName": "趙"
}
}
傳回頂部
6.4.2 增量修改
增量修改是隻修改指定id比對的文檔中的部分字段。
文法:
POST /{索引庫名}/_update/文檔id
{
"doc": {
"字段名": "新的值",
}
}
示例:
POST /zyx/_update/1
{
"doc": {
"email": "[email protected]"
}
}
傳回頂部
6.5 總結
- 建立文檔:
POST /{索引庫名}/_doc/文檔id { json文檔 }
- 查詢文檔:
GET /{索引庫名}/_doc/文檔id
- 删除文檔:
DELETE /{索引庫名}/_doc/文檔id
- 修改文檔:
- 全量修改:
PUT /{索引庫名}/_doc/文檔id { json文檔 }
- 增量修改:
POST /{索引庫名}/_update/文檔id { "doc": {字段}}