Elasticsearch從入門到精通-03基本語法學(xué)習(xí)
??作者簡介:大家好,我是程序員行走的魚
?? 本篇主要介紹和大家一塊學(xué)習(xí)一下ES基本語法,主要包括索引管理、文檔管理、映射管理等內(nèi)容
1.1 了解Restful
ES對(duì)數(shù)據(jù)進(jìn)行增、刪、改、查是以Restful方式對(duì)服務(wù)端發(fā)送請(qǐng)求的,所以在我們學(xué)習(xí)基本語法之前先了解一下Restful是什么?
REST
指的是一組架構(gòu)約束條件和原則。滿足這些約束條件和原則的應(yīng)用程序或設(shè)計(jì)就是RESTful
。Web 應(yīng)用程序最重要的 REST
原則是,客戶端和服務(wù)器之間的交互在請(qǐng)求之間是無狀態(tài)的。從客戶端到服務(wù)器的每個(gè)請(qǐng)求都必須包含理解請(qǐng)求所必需的信息。如果服務(wù)器在請(qǐng)求之間的任何時(shí)間點(diǎn)重啟,客戶端不會(huì)得到通知。此外,無狀態(tài)請(qǐng)求可以由任何可用服務(wù)器回答,這十分適合云計(jì)算之類的環(huán)境??蛻舳丝梢跃彺鏀?shù)據(jù)以改進(jìn)性能。
在服務(wù)器端,應(yīng)用程序狀態(tài)和功能可以分為各種資源。資源是一個(gè)有趣的概念實(shí)體,它向客戶端公開。資源的例子有:應(yīng)用程序?qū)ο?、?shù)據(jù)庫記錄、算法等等。每個(gè)資源都使用 URI (Universal Resource Identifier) 得到一個(gè)唯一的地址。所有資源都共享統(tǒng)一的接口,以便在客戶端和服務(wù)器之間傳輸狀態(tài)。使用的是標(biāo)準(zhǔn)的 HTTP 方法,比如 GET、PUT、POST 和DELETE。
在 REST
樣式的 Web 服務(wù)中,每個(gè)資源都有一個(gè)地址。資源本身都是方法調(diào)用的目標(biāo),方法列表對(duì)所有資源都是一樣的。這些方法都是標(biāo)準(zhǔn)方法,包括 HTTP GET、POST、PUT、DELETE,還可能包括 HEAD 和 OPTIONS。簡單的理解就是,如果想要訪問互聯(lián)網(wǎng)上的資源,就必須向資源所在的服務(wù)器發(fā)出請(qǐng)求,請(qǐng)求體中必須包含資源的網(wǎng)絡(luò)路徑,以及對(duì)資源進(jìn)行的操作(增刪改查)。
1.2 Elasticsearch的數(shù)據(jù)格式
Elasticsearch
是面向文檔型數(shù)據(jù)庫,一條數(shù)據(jù)在這里就是一個(gè)文檔。為了方便大家理解,我們將 Elasticsearch
里存儲(chǔ)文檔數(shù)據(jù)和關(guān)系型數(shù)據(jù)庫MySQL
存儲(chǔ)數(shù)據(jù)的概念進(jìn)行一個(gè)類比
ES 里的 Index 可以看做一個(gè)庫,而 Types 相當(dāng)于表,Documents 則相當(dāng)于表的行。這里 Types 的概念已經(jīng)被逐漸弱化,Elasticsearch
6.X 中,一個(gè) index 下已經(jīng)只能包含一個(gè)type,Elasticsearch
7.X 中, Type 的概念已經(jīng)被刪除了。
1.3 索引操作
1)創(chuàng)建索引
語法:put /索引名
示例:
{
“acknowledged”【響應(yīng)結(jié)果】: true, # true 操作成功
“shards_acknowledged”【分片結(jié)果】: true, # 分片操作成功
“index”【索引名稱】: “shopping”
}
注意:創(chuàng)建索引庫的分片數(shù)(7.0.0之后)默認(rèn)1片,在 7.0.0 之前的 Elasticsearch 版本中,默認(rèn) 5 片
當(dāng)然ES是不允許我們重復(fù)創(chuàng)建索引的,如果重復(fù)創(chuàng)建索引出報(bào)以下錯(cuò)誤:
2)查詢索引
語法:GET /索引名
示例:
{
"es_db": { //索引名
"aliases": {}, //別名
"mappings": {},//映射
"settings": {//設(shè)置
"index": { //【設(shè)置 - 索引
"creation_date": "1669733081007",//設(shè)置 - 索引 - 創(chuàng)建時(shí)間
"number_of_shards": "1",//設(shè)置 - 索引 - 主分片數(shù)量
"number_of_replicas": "1",//設(shè)置 - 索引 - 副分片數(shù)量
"uuid": "qhr5DAFeSrOGex2vElBwag", //設(shè)置 - 索引 - 唯一標(biāo)識(shí)
"version": { //設(shè)置 - 索引 - 版本
"created": "7080099"
},
"provided_name": "shopping" //設(shè)置 - 索引 - 名稱
}
}
}
}
3)查詢所有索引
語法:GET /_cat/indices?v
這里請(qǐng)求路徑中的_cat 表示查看的意思,indices 表示索引,所以整體含義就是查看當(dāng)前 ES服務(wù)器中的所有索引,就好像 MySQL 中的 show tables 的感覺.
示例:
字段說明:
表頭 | 含義 |
---|---|
health | 當(dāng)前服務(wù)器健康狀態(tài):green(集群完整) yellow(單點(diǎn)正常、集群不完整) red(單點(diǎn)不正常) |
status | 索引打開、關(guān)閉狀態(tài) |
index | 索引名 |
uuid | 索引統(tǒng)一編號(hào) |
pri | 主分片數(shù)量 |
rep | 副本數(shù)量 |
docs.count | 可用文檔數(shù)量 |
docs.deleted | 文檔刪除狀態(tài)(邏輯刪除) |
store.size | 主分片和副分片整體占空間大小 |
pri.store.size | 主分片占空間大小 |
4)刪除索引
語法:DELETE /索引名稱
示例:
1.4 文檔操作
1)創(chuàng)建文檔
索引已經(jīng)創(chuàng)建好了,接下來我們來創(chuàng)建文檔,并添加數(shù)據(jù)。這里的文檔可以類比為關(guān)系型數(shù)據(jù)庫中的表數(shù)據(jù),添加的數(shù)據(jù)格式為 JSON 格式
PUT /es_db/_doc/1
{
"name": "張三",
"sex": 1,
"age": 25,
"address": "廣州天河公園",
"remark": "java developer"
}
PUT /es_db/_doc/2
{
"name": "李四",
"sex": 1,
"age": 28,
"address": "廣州荔灣大廈",
"remark": "java assistant"
}
PUT /es_db/_doc/3
{
"name": "rod",
"sex": 0,
"age": 26,
"address": "廣州白云山公園",
"remark": "php developer"
}
PUT /es_db/_doc/4
{
"name": "admin",
"sex": 0,
"age": 22,
"address": "長沙橘子洲頭",
"remark": "python assistant"
}
PUT /es_db/_doc/5
{
"name": "小明",
"sex": 0,
"age": 19,
"address": "長沙岳麓山",
"remark": "java architect assistant"
}
結(jié)果:
"_index" : "es_db",//索引
"_type" : "_doc",//類型-文檔
"_id" : "1",//唯一標(biāo)識(shí) 可以類比為 MySQL 中的主鍵,不指定隨機(jī)生成
"_version" : 1,//版本
"result" : "created",//這里的 create 表示創(chuàng)建成功
"_shards" : {//分片
"total" : 2, //分片 - 總數(shù)
"successful" : 1,//分片 - 成功
"failed" : 0//分片 - 失敗
},
"_seq_no" : 0,
"_primary_term" : 1
}
使用put名稱添加數(shù)據(jù)的時(shí)候必須指定id,使用post可以不需要添加id,系統(tǒng)會(huì)默認(rèn)隨機(jī)生成一個(gè)id
2)查看文檔
查看文檔時(shí),需要指明文檔的唯一性標(biāo)識(shí),類似于 MySQL 中數(shù)據(jù)的主鍵查詢
語法: PUT /索引名稱/類型/id
示例:
{
"_index" : "es_db", //索引
"_type" : "_doc",//文檔類型
"_id" : "1",//文檔id
"_version" : 1,//文檔版本
"_seq_no" : 0,
"_primary_term" : 1,
"found" : true,//查詢結(jié)果 true 表示查找到,false 表示未查找到
"_source" : {//文檔源信息
"name" : "張三",
"sex" : 1,
"age" : 25,
"address" : "廣州天河公園",
"remark" : "java developer"
}
}
3)修改文檔
和新增文檔一樣,輸入相同的 URL 地址請(qǐng)求,如果請(qǐng)求體變化,會(huì)將原有的數(shù)據(jù)內(nèi)容覆蓋。
POST /es_db/_doc/1
{
"name": "張三_修改",
"sex": 1,
"age": 25,
"address": "廣州天河公園",
"remark": "java developer"
}
示例:
4)刪除文檔
刪除一個(gè)文檔不會(huì)立即從磁盤上移除,它只是被標(biāo)記成已刪除(邏輯刪除)。
語法: DELETE /索引名稱/類型/id
示例:
5)批量獲取文檔
方式1:
GET _mget
{
"docs": [
{
"_index": "es_db",
"_type": "_doc",
"_id": 1
},
{
"_index": "es_db",
"_type": "_doc",
"_id": 2
}
]
}
示例:
方式2:
GET /es_db/_mget
{
"docs": [
{
"_type": "_doc",
"_id": 3
},
{
"_type": "_doc",
"_id": 4
}
]
}
示例:
方法3:
GET /es_db/_doc/_mget
{
"docs": [
{
"_id": 1
},
{
"_id": 2
}
]
}
6)批量操作文檔
格式:
批量對(duì)文檔進(jìn)行寫操作是通過_bulk的API來實(shí)現(xiàn)的
- 請(qǐng)求方式:POST
- 請(qǐng)求地址:_bulk
- 請(qǐng)求參數(shù):通過_bulk操作文檔,一般至少有兩行參數(shù)(或偶數(shù)行參數(shù))
- 第一行參數(shù)為指定操作的類型和操作的對(duì)象
- 第二行參數(shù)才是操作的數(shù)據(jù)
{"actionName":{"_index":"indexName", "_type":"typeName","_id":"id"}}
{"field1":"value1", "field2":"value2"}
- actionName:表示操作類型,主要有create,index,delete和update
批量創(chuàng)建文檔:
POST _bulk
{"create":{"_index":"es_db","_type":"_doc","_id":6}}
{"id":6,"name" : "李四","sex" : 1,"age" : 28,"address" : "廣州荔灣大廈", "remark" : "java assistant"}
{"create":{"_index":"es_db","_type":"_doc","_id":7}}
{"id":6,"name" : "李四","sex" : 1,"age" : 28,"address" : "廣州荔灣大廈", "remark" : "java assistant"}
普通創(chuàng)建或者全量替換INDEX
- 如果原文檔不存在,則是創(chuàng)建
- 如果原文檔存在,則是替換(全量修改原文檔)
POST _bulk
{"index":{"_index":"es_db","_type":"_doc","_id":6}}
{"id":6,"name":"李四_修改"}
{"index":{"_index":"es_db","_type":"_doc","_id":8}}
{"id":8,"name":"李四","sex":1,"age":28,"address":"廣州荔灣大廈","remark":"java assistant"}
批量刪除:
POST _bulk
{"delete":{"_index":"es_db", "_type":"_doc", "_id":6}}
{"delete":{"_index":"es_db", "_type":"_doc", "_id":7}}
批量修改:
POST _bulk
{"update":{"_index":"es_db", "_type":"_doc", "_id":3}}
{"doc":{"name":"李四_修改"}}
{"update":{"_index":"es_db", "_type":"_doc", "_id":4}}
{"doc":{"name":"李四_修改"}}
1.5 索引映射
有了索引庫,等于有了數(shù)據(jù)庫中的 database。接下來就需要建索引庫(index)中的映射了,類似于數(shù)據(jù)庫(database)中的表結(jié)構(gòu)(table)。創(chuàng)建數(shù)據(jù)庫表需要設(shè)置字段名稱,類型,長度,約束等;索引庫也一樣,需要知道這個(gè)類型下有哪些字段,每個(gè)字段有哪些約束信息,這就叫做映射(mapping)。ES中映射可以分為動(dòng)態(tài)映射和靜態(tài)映射
動(dòng)態(tài)映射:
在關(guān)系數(shù)據(jù)庫中,需要事先創(chuàng)建數(shù)據(jù)庫,然后在該數(shù)據(jù)庫下創(chuàng)建數(shù)據(jù)表,并創(chuàng)建表字段、類型、長度、主鍵等,最后才能基于表插入數(shù)據(jù)。而Elasticsearch中不需要定義Mapping映射(即關(guān)系型數(shù)據(jù)庫的表、字段等),在文檔寫入Elasticsearch時(shí),會(huì)根據(jù)文檔字段自動(dòng)識(shí)別類型,這種機(jī)制稱之為動(dòng)態(tài)映射。
動(dòng)態(tài)映射規(guī)則如下:
靜態(tài)映射:
靜態(tài)映射是在Elasticsearch中也可以事先定義好映射,包含文檔的各字段類型、分詞器等,這種方式稱之為靜態(tài)映射。
1)創(chuàng)建映射
創(chuàng)建student索引
PUT /student
創(chuàng)建student索引映射
語法:
PUT /student/_mapping
{
"properties":{
"name":{
"type":"text",
"index":true
},
"sex":{
"type":"text",
"index":false
},
"age":{
"type":"long",
"index":false
}
}
}
映射數(shù)據(jù)說明:
-
字段名:任意填寫,下面指定許多屬性,例如:title、subtitle、images、price
-
type:類型,Elasticsearch 中支持的數(shù)據(jù)類型非常豐富,說幾個(gè)關(guān)鍵的:
- String 類型,又分兩種:
- text:可分詞
- keyword:不可分詞,數(shù)據(jù)會(huì)作為完整字段進(jìn)行匹配
- Numerical:數(shù)值類型,分兩類
- 基本數(shù)據(jù)類型:long、integer、short、byte、double、float、half_float
- 浮點(diǎn)數(shù)的高精度類型:scaled_float
- Date:日期類型
- Array:數(shù)組類型
- Object:對(duì)象
- String 類型,又分兩種:
-
index:是否索引,默認(rèn)為 true,也就是說你不進(jìn)行任何配置,所有字段都會(huì)被索引。
- true:字段會(huì)被索引,則可以用來進(jìn)行搜索
- false:字段不會(huì)被索引,不能用來搜索
-
store:是否將數(shù)據(jù)進(jìn)行獨(dú)立存儲(chǔ),默認(rèn)為 false
原始的文本會(huì)存儲(chǔ)在_source 里面,默認(rèn)情況下其他提取出來的字段都不是獨(dú)立存儲(chǔ)的,是從_source 里面提取出來的。當(dāng)然你也可以獨(dú)立的存儲(chǔ)某個(gè)字段,只要設(shè)置"store": true 即可,獲取獨(dú)立存儲(chǔ)的字段要比從_source 中解析快得多,但是也會(huì)占用更多的空間,所以要根據(jù)實(shí)際業(yè)務(wù)需求來設(shè)置。
2)修改映射
一個(gè)索引庫如果創(chuàng)建好了索引映射,是無法直接進(jìn)行修改的,會(huì)提示一下錯(cuò)誤:
那么我們?nèi)绾巫鲆粋€(gè)不修改代碼、不停機(jī)的前提下去做一個(gè)索引映射的調(diào)整呢?那我們接著往下看
上邊我們已經(jīng)為student創(chuàng)建過映射,現(xiàn)在查看下庫里的數(shù)據(jù)
這時(shí)候我們需要把name改為keyword類型,先創(chuàng)建一個(gè)新的索引student1
PUT /student1
{
"settings":{},
"mappings":{
"properties": {
"age": {
"type": "long",
"index": false
},
"name": {
"type": "keyword",
"index": false
},
"sex": {
"type": "text",
"index": false
}
}
}
}
開始數(shù)據(jù)遷移:
POST _reindex
{
"source": {
"index": "student"
},
"dest": {
"index": "student1"
}
}
刪除老索引:
DELETE /student
給新索引起別名
PUT /student1/_alias/student
再看下新索引映射:
再看下新索引數(shù)據(jù):
"index": false
},
"sex": {
"type": "text",
"index": false
}
}
}
}
[外鏈圖片轉(zhuǎn)存中...(img-H1Q2H8Kq-1709993484097)]
開始數(shù)據(jù)遷移:
```json
POST _reindex
{
"source": {
"index": "student"
},
"dest": {
"index": "student1"
}
}
刪除老索引:
DELETE /student
給新索引起別名
PUT /student1/_alias/student
再看下新索引映射:
再看下新索引數(shù)據(jù):
文章來源:http://www.zghlxwxcb.cn/news/detail-840124.html
??至此本篇就結(jié)束了,下一篇將介紹ES高級(jí)語法DSL!文章來源地址http://www.zghlxwxcb.cn/news/detail-840124.html
到了這里,關(guān)于Elasticsearch從入門到精通-03基本語法學(xué)習(xí)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!