【ES】2.Elastic操作

索引操作

創(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/_close
  • POST heshen_test_v1/_open
  • 被關(guān)閉的索引禁止讀寫,只能展示元信息

索引統(tǒng)計

  • GET``/``_stats
  • GET /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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容