索引操作
創(chuàng)建索引 文檔
基本語法
PUT twitter索引名稱限制:
只能小寫
不能包括
\,/,*,?,",<,>,|, 空格 ,,,#不能包括冒號,7.0之前可以用,7.0之后不可以
不能使用 + - 開頭
不能包括 . 或者 ..
不能超過 255 個字節(jié)
PUT heshen_test_v1
{
"settings": {
"index":{
"number_of_replicas": 2, //副本數(shù)2
"number_of_shards": 3,//分片3
"max_result_window": 1000000, //最大返回數(shù)據(jù) 1000000
"write" : {
"wait_for_active_shards" : "2" //等待多少分片執(zhí)行完成
}
}
},
"mappings": { //映射字段
"_doc":{ // 約定都使用_doc ,可以不實用_doc,但是不能使用_開頭,
"properties":{
"itemName":{
"type" : "text"
},
"weight":{
"type" : "scaled_float",
"scaling_factor": 100
},
"price":{
"type" : "long"
}
}
}
},
"aliases": {//別名,用處很多
"heshen_test": {}
},
}
獲取索引
-
GET heshen_test獲取指定索引信息 -
GET *獲取所有的索引信息 -
GET _all獲取所有的索引信息 -
GET es_erp_purchase_*獲取通配符匹配的索引信息
刪除索引
DELETE heshen_test_v1- 刪除索引必須是索引名,不能通過別名刪除索引
是否存在
-
HEAD heshen_test索引是否存在
打開/關(guān)閉索引
POST heshen_test_v1/_closePOST heshen_test_v1/_open- 被關(guān)閉的索引禁止讀寫,只能展示元信息
索引統(tǒng)計
GET``/``_statsGET /heshen_test_v1/_stats
索引別名
創(chuàng)建修改別名
- 帶有過濾器的別名提供了創(chuàng)建相同索引的不同“視圖”的簡單方法。過濾器可以使用查詢DSL定義,并應(yīng)用于所有搜索、計數(shù)、按查詢刪除以及類似于此別名的操作。
- 在創(chuàng)建別名時可以指定路由值。
- 如果一個別名只映射了一個真實索引,則可以使用別名進行index api(即索引文檔,寫文檔),但如果一個別名同一時間映射了多個索引,默認是不能直接使用別名進行索引文檔,因為ES不知道文檔該發(fā)往哪個索引。可以使用is_write_index屬性為一個別名下的其中一個索引指定為寫索引,此時則可以直接使用別名進行index api的調(diào)用。
POST _aliases
{
"actions": [
{
"add": {
"index": "heshen_test_v1",
"alias": "heshen",
"is_write_index": true,
"routing": "1",
"filter": {
"term": {
"remarks": "測試"
}
}
}
},
{
"add": {
"index": "heshen_test_v2",
"alias": "heshen"
}
}
]
}
刪除別名
POST _aliases
{
"actions": [
{
"remove": {
"index": "heshen_test_v2",
"alias": "heshen"
}
},
{
"remove": {
"index": "heshen_test_v1",
"alias": "heshen"
}
}
]
}
Reindex
- es的索引一旦創(chuàng)建,分片,以及字段類型都不允許修改,所以一般只能創(chuàng)建新的索引,然后把數(shù)據(jù)導(dǎo)入
- reindex支持把數(shù)據(jù)從一個索引拷貝到另一個索引中
- reindex不會復(fù)制索引的設(shè)置,包括mapping ,settings
普通復(fù)制
POST _reindex
{
"source": {
"index": "heshen_test_v1"
},
"dest": {
"index": "heshen_test_v2"
}
}
其他參數(shù)
- 在dest中 添加 version_type (見下文類型介紹 ) 字段可以實現(xiàn)根據(jù)版本進行復(fù)制
- 默認情況下,version沖突會終止reindex進程,可以通過 conflicts 屬性來設(shè)置不結(jié)束,只統(tǒng)計沖突數(shù)量
- 在dest中 op_type 可以設(shè)置操作類型,可以設(shè)置只復(fù)制不存在的數(shù)據(jù)
- 可以通過 query屬性來設(shè)置那些數(shù)據(jù)被復(fù)制
- source的index 可以是一個列表 ,來將多個索引的數(shù)據(jù)復(fù)制到一個索引
- source的 _source 可以設(shè)置只復(fù)制部分字段
- 可以用過 script 來修改文檔
POST _reindex
{
"size": 12,//只處理12條數(shù)據(jù)
"conflicts": "proceed",//沖突計數(shù)
"source": {
"index": "heshen_test_v1", //也可以是 "index":[ "heshen_test_v1"," "heshen_test_v3"]
"query": { //設(shè)置源數(shù)據(jù)那些數(shù)據(jù)需要復(fù)制
"term": {
"weight": {
"value": 12
}
}
},
"_source": ["weight", "itemName"],//只復(fù)制部分字段
"sort": { "date": "desc" },//設(shè)置處理數(shù)據(jù)排序
"script": {
"inline": "if (ctx._source.foo == 'bar') {ctx._version++; ctx._source.remove('foo')}",
"lang": "painless"
}
},
"dest": {
"index": "heshen_test_v2",
"version_type": "external", //版本復(fù)制
"op_type":"create" //只會創(chuàng)建不存在的數(shù)據(jù)
}
}
索引模板
索引模板是什么
- 索引模板是可以在創(chuàng)建一個新的索引的時候,自動應(yīng)用的模板,包括設(shè)置和映射。
- 模板只在創(chuàng)建索引的時候使用,更改模板不會對現(xiàn)有索引產(chǎn)生影響
- 在創(chuàng)建的時候,自定義的設(shè)置,映射優(yōu)先于 模板當(dāng)中的。
創(chuàng)建索引模板
PUT _template/template_heshen
{
"index_patterns": [//匹配模式
"heshen*"
],
"order" : 0,//優(yōu)先級
"settings": {//預(yù)定的設(shè)置
"index": {
"number_of_replicas": 2,
"number_of_shards": 3,
"max_result_window": 1000000
}
},
"mappings": {//預(yù)定的mappings
"_doc": {
"properties": {
"created_name": {
"type": "keyword"
}
}
},
"version": 123
}
}
刪除索引模板
DELETE``/``_template/template_heshen
獲取索引模板
GET /_template/template_heshen
模板是否存在
HEAD /_template/template_heshen
模板匹配
- 多個模板可以匹配一個索引,多個相同的配置根據(jù)order字段來確定使用那個
Mapping操作
更新Mapping
- 映射已經(jīng)創(chuàng)建后,一般不可以更改,除了更改子對象的字段,或者 ignore_above 屬性
- 可以新增一個字段映射
PUT heshen_test_v1/_mapping/_doc
{
"properties":{
"img":{
"type":"keyword"
}
}
}
- 也可以批量添加字段映射
PUT /twitter-1,twitter-2/_mapping/_doc
{
"properties": {
"user_name": {
"type": "text"
}
}
}
獲取Mapping
-
GET /heshen_test_v1/_mapping獲取整個Mapping信息 GET /heshen_test_v1/_mapping/_doc-
GET /heshen_test_v1/_mapping/field/img獲取某個字段的映射
Settings操作
更新Settings 文檔
- 注意分片數(shù)不可以修改
PUT /heshen_test_v1/_settings
{
"index" : {
"number_of_replicas" : 1
}
}
獲取Settings
GET heshen_test_v1/_settings
文檔 Document
插入
指定id插入,如果存在則是更新
PUT heshen_test_v1/_doc/2
{
"itemName": "C貨2",
"weight": 12,
"price":20
}
es自動生成id (使用post代替put)
POST heshen_test_v1/_doc/2
{...}
指定操作類型,指定類型為創(chuàng)建,如果id已經(jīng)存在,就會返回失敗
PUT heshen_test_v1/_doc/4/_create
{...}
PUT heshen_test_v1/_doc/4?op_type=create
{...}
超時時間
PUT heshen_test_v1/_doc/4?timeout=10ms
{...}
版本號-樂觀鎖更新
- 默認es采用內(nèi)部版本控制,每一次更新版本號+1,我們可以使用version_type=external 來啟用外部版本號功能。
- 請求的版本號需要是非負正整數(shù)
- 默認es的內(nèi)部版本控制為一定要與當(dāng)前版本號相同才能更新成功
- (啟用之后,之后好像就不用在每次帶version_type)
PUT heshen_test_v1/_doc/2?version=17
{...}
當(dāng)文檔version=17的時候保存成功
PUT heshen_test_v1/_doc/2?version=17&version_type=external_gte
{...}
當(dāng)文檔version<=17的時候成功
PUT heshen_test_v1/_doc/2?version=17&version_type=external
{...}
當(dāng)文檔version<17的時候成功
version_type類型
internal :完全相同才成功
external_gt || external :當(dāng)請求的版本號大于的時候才成功
external_gte :當(dāng)請求的版本號大于等于的時候才成功
自動創(chuàng)建索引。
如果索引不存在,自動創(chuàng)建索引,并且應(yīng)用索引模板,字段類型es會動態(tài)生成??梢酝ㄟ^action.auto_create_index 來控制。
PUT _cluster/settings
{
"persistent": {
"action.auto_create_index": "heshen*"http://只允許某些索引創(chuàng)建
}
}
PUT _cluster/settings
{
"persistent": {
"action.auto_create_index": "false" //全部不允許
}
}
PUT _cluster/settings
{
"persistent": {
"action.auto_create_index": "true" //全部允許
}
}
更新
基于id部分字段更新
- 存在的字段會被更新
- 不存在的字段會添加,映射不存在的會自動添加映射
POST heshen_test_v1/_doc/1/_update
{
"doc": {
"itemName":"C貨112"
}
}
基于腳本更新
- 基于es的script腳本進行更新
POST heshen_test_v1/_doc/1/_update
{
"script": {
"source":"ctx._source.remarks='和天下'"
}
}
POST heshen_test_v1/_doc/1/_update
{
"script": {
"source": "ctx._source.weight=params.count",
"lang": "painless",
"params": {
"count": 4
}
}
}
Upsert
- 普通更新如果文檔不存在,會報錯
- 而加了upsert之后,如果文檔不存在,會初始化文檔
POST heshen_test_v1/_doc/6/_update
{
"script": {
"source": "ctx._source.weight=params.count",
"lang": "painless",
"params": {
"count": 4
}
},
"upsert": {
"itemName": "C貨2",
"weight": 12,
"price": 20
}
}
更新基于條件
POST heshen_test_v1/_update_by_query
{
"script": {
"source": "ctx._source.remarks=ctx._source.remarks+'*'",
"lang": "painless"
},
"query": {
"terms": {
"_id": [
"1"
]
}
}
}
如何使用腳本
腳本構(gòu)成
"script": {
"lang": "...", //腳本使用的語言 默認為 painless
"source" | "id": "...", //
"params": { ... } //參數(shù)
}
搜索返回字段
- es在第一次執(zhí)行腳本的時候會把他緩存起來,所以如果腳本里有參數(shù)的話,一般是要使用參數(shù)字段,而不是硬編碼
GET heshen_test_v1/_search
{
"script_fields": {
"weight_big": {
"script": {
"lang": "expression",
"source":"doc['weight'] * sp",
"params": {
"sp": 100
}
}
}
}
}
操作數(shù)據(jù)
- 在reindex 和 update_by_query 可以設(shè)置數(shù)據(jù)的屬性,甚至刪除數(shù)據(jù)
noop: 設(shè)置 ctx.op = “noop” 。如果你的腳本并沒有對原來的doc做任何更改。這將導(dǎo)致 reindex 忽略該doc。這將在響應(yīng)的 noop 中被展示。
delete: 設(shè)置ctx.op = “delete”,如果你的腳本如此設(shè)定,target index中的該doc會被被刪除。這將在響應(yīng)的 deleted 中被展示。
刪除
基于id進行刪除
DELETE heshen_test_v1/_doc/1
基于條件刪除
POST heshen_test_v1/_delete_by_query
{
"query": {
"terms": {
"_id": [
"1"
]
}
}
}
Bulk 批量增刪改
- bulk是es提供的一種批量增刪改
語法
除delete操作意外,所有的操作必須是一對JSON ,而且每個JSON不能換行,相鄰JSON必須換行,
- 格式:
POST _bulk
{ action: { metadata }}
{ request body }
{ action: { metadata }}
{ request body }
操作類型
-
create如果文檔不存在就創(chuàng)建,但如果文檔存在就返回錯誤 -
index如果文檔不存在就創(chuàng)建,如果文檔存在就更新 -
update更新一個文檔,如果文檔不存在就返回錯誤 -
delete刪除一個文檔,如果要刪除的文檔id不存在,就返回錯誤
示例
POST _bulk
{"index":{"_index":"heshen_test_v1","_type":"_doc","_id":"4"}}
{"_doc":{"itemName":"C貨3","weight":12,"price":20}}
POST heshen_test_v1/_doc/_bulk
{"delete": {"_id": 5}}
ps:在es的bulk操作中,可以把索引,type加在操作前面,這樣在json中可以不寫出 index ,type