ES 筆記四十四:Update By Query & Reindex API

CrazyZard發表於2020-01-12
  • 一般在以下幾種情況時,我們需要重建索引:
    • 索引的 Mappings 發生變更:欄位型別更改,分詞器及字典更新
    • 索引的 Setting 發生變更:索引的主分片數發生改變
    • 叢集內,叢集間需要做資料遷移
  • ElastiicSearch 的內建提供的API
    • Update By Query :在現有索引上重建
    • Reindex:在其他索引上重建索引
  • 改變 Mapping , 增加子欄位,使用英文分詞器
  • 此時嘗試對子欄位進行查詢
  • 雖然有資料已經存在,但是沒有返回結果

ES筆記四十四:Update By Query & Reindex API

Update By Query

  • 執行 Update By Query
  • 嘗試對 Multi-Fields 查詢查詢
  • 返回結果

ES筆記四十四:Update By Query & Reindex API

# 寫入文件
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 上對欄位型別進行修改
  • 只能建立新的索引,並設定正確的欄位型別,在重新匯入資料

ES筆記四十四:Update By Query & Reindex API

# 建立新的索引並且設定新的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"
}

ES筆記四十四:Update By Query & Reindex API

  • 索引的 mapping _source 要開啟
  • 先建立一個新索引,然後在執行 reindex
    ES筆記四十四:Update By Query & Reindex API
  • _reindex 指揮建立不存在的文件
  • 文件如果存在,會導致版本衝突
    # Reindx API,version Type Internal
    POST  _reindex
    {
      "source": {
        "index": "blogs"
      },
      "dest": {
        "index": "blogs_fix",
        "op_type": "create"
      }
    }

ES筆記四十四:Update By Query & Reindex API

  • 需要修改 elasticsearch.yml ,並且重啟節點

ES筆記四十四:Update By Query & Reindex API

  • Reindex API 支援一步操作,執行只返回 Task Id
  • POST _reindex?wait_for_completion=false

ES筆記四十四:Update By Query & Reindex API

  • Update By Query 使用場景: 為欄位新增子欄位;欄位更改分詞器;更新分詞器詞庫
  • Reindex API 使用場景:修改欄位型別
    • 需要先對新索引設定 Mapping,索引的設定和對映關係不會被複制
  • 通過檢視 Task API,瞭解 Reindex 的狀況
  • Remote ReIndex ,需要修改 elasticsearch.yml 配置並且重啟
  • 一定要儘量使用Index Alias 讀寫資料。即便發生 Reindex,也能實現零停機維護
本作品採用《CC 協議》,轉載必須註明作者和本文連結

快樂就是解決一個又一個的問題!

相關文章