- 一般在以下幾種情況時,我們需要重建索引:
- 索引的 Mappings 發生變更:欄位型別更改,分詞器及字典更新
- 索引的 Setting 發生變更:索引的主分片數發生改變
- 叢集內,叢集間需要做資料遷移
- ElastiicSearch 的內建提供的API
- Update By Query :在現有索引上重建
- Reindex:在其他索引上重建索引
- 改變 Mapping , 增加子欄位,使用英文分詞器
- 此時嘗試對子欄位進行查詢
- 雖然有資料已經存在,但是沒有返回結果
Update By Query
- 執行 Update By Query
- 嘗試對 Multi-Fields 查詢查詢
- 返回結果
# 寫入文件
PUT blogs/_doc/1
{
"content":"Hadoop is cool",
"keyword":"hadoop"
}
# 修改 Mapping,增加子欄位,使用英文分詞器
PUT blogs/_mapping
{
"properties" : {
"content" : {
"type" : "text",
"fields" : {
"english" : {
"type" : "text",
"analyzer":"english"
}
}
}
}
}
# 寫入文件
PUT blogs/_doc/2
{
"content":"Elasticsearch rocks",
"keyword":"elasticsearch"
}
# 查詢新寫入文件
POST blogs/_search
{
"query": {
"match": {
"content.english": "Elasticsearch"
}
}
}
# 查詢 Mapping 變更前寫入的文件
POST blogs/_search
{
"query": {
"match": {
"content.english": "hadoop"
}
}
}
# Update所有文件
POST blogs/_update_by_query
{
}
- ES 不允許在原有 Mapping 上對欄位型別進行修改
- 只能建立新的索引,並設定正確的欄位型別,在重新匯入資料
# 建立新的索引並且設定新的Mapping
PUT blogs_fix/
{
"mappings": {
"properties": {
"content": {
"type": "text",
"fields": {
"english": {
"type": "text",
"analyzer": "english"
}
}
},
"keyword": {
"type": "keyword"
}
}
}
}
# Reindx API
POST _reindex
{
"source": {
"index": "blogs"
},
"dest": {
"index": "blogs_fix"
}
}
GET blogs_fix/_doc/1
# 測試 Term Aggregation
POST blogs_fix/_search
{
"size": 0,
"aggs": {
"blog_keyword": {
"terms": {
"field": "keyword",
"size": 10
}
}
}
}
Reindex API
- Reindex API 支援把文件從一個索引拷貝到另外一個索引
- 使用 Reindex API 的一些場景
- 修改索引的主分片數
- 改變欄位的Mapping 中的欄位型別
- 叢集中資料遷移、跨叢集的資料遷移
# Reindx API,version Type Internal
POST _reindex
{
"source": {
"index": "blogs"
},
"dest": {
"index": "blogs_fix",
"version_type": "internal"
}
}
# 文件版本號增加
GET blogs_fix/_doc/1
# Reindx API,version Type Internal
POST _reindex
{
"source": {
"index": "blogs"
},
"dest": {
"index": "blogs_fix",
"version_type": "external"
}
}
# Reindx API,version Type Internal
POST _reindex
{
"source": {
"index": "blogs"
},
"dest": {
"index": "blogs_fix",
"version_type": "external"
},
"conflicts": "proceed"
}
- 索引的 mapping _source 要開啟
- 先建立一個新索引,然後在執行 reindex
- 需要修改 elasticsearch.yml ,並且重啟節點
- Reindex API 支援一步操作,執行只返回 Task Id
- POST _reindex?wait_for_completion=false
- Update By Query 使用場景: 為欄位新增子欄位;欄位更改分詞器;更新分詞器詞庫
- Reindex API 使用場景:修改欄位型別
- 需要先對新索引設定 Mapping,索引的設定和對映關係不會被複制
- 通過檢視 Task API,瞭解 Reindex 的狀況
- Remote ReIndex ,需要修改 elasticsearch.yml 配置並且重啟
- 一定要儘量使用Index Alias 讀寫資料。即便發生 Reindex,也能實現零停機維護
本作品採用《CC 協議》,轉載必須註明作者和本文連結