Elasticsearch 6.* 升級 7.* 歷險記

曉鶴發表於2019-07-14

具體情況是這樣的

跟著課程裡面學習 EleasticSearch 版本是 6.*, 但是自己伺服器本著新就是生產力的原則(手賤)安裝了最新的(截止目前) 7.2 版本,導致滿心歡喜執行建立索引操作時,一堆 error、warning(流下了悔恨的淚水),這裡記錄下如何解決開發 & 線上 ES 版本差異導致的程式碼不相容問題

首先通過以下的 warning 資訊找到了和自己遇到了同樣人生難題的難友們, 不過注意到這裡其實是安裝 kibana 遇到的,我是建立索引。具體 GitHub 地址在這裡
https://github.com/elastic/kibana/issues/3...

[illegal_argument_exception] The mapping definition cannot be nested under a type [_doc] unless include_type_name is set to true.

通過自己豐富的知識從回答中遍歷到了一個可能的正確答案(主要是回答的人明顯帶有 author 標籤,大概不會騙人吧),就是如下這個

Either the template needs to be changed to remove the mapping type _doc or the command needs to include ?include_type_name=true, preferably the latter to be forward-compatible.

大意就是 ES 7. 中要要麼移除 doc type 或者在使用的時候需要加上 ?includetypename=true, 因為 ?include_type_name=true 這一項在 ES 6. 和 ES 7. 的預設設定不一樣。並且建議採用後一種方式(也就是加上 include_type_name=true),因為是向前相容的(就是 ES 6. 和 7.* 都可以正常使用)

本著聽人勸吃飽飯的原則,我選擇了第二種。但問題是自己的索引建立是通過程式碼建立的,暫時不清楚 include_type_name 需要加到什麼地方。通過看 PHP ES Client 相關的程式碼瞭解到在建立的時候是可以附加上 parameters 的,就將原有的

'index' => $aliasName.'_0',
'body'  => [
    // 呼叫索引類的 getSettings() 方法獲取索引設定
    'settings' => $indexClass::getSettings(),
    'mappings' => [
        '_doc' => [
            // 呼叫索引類的 getProperties() 方法獲取索引欄位
            'properties' => $indexClass::getProperties(),
        ],
    ],
    'aliases'  => [
        // 同時建立別名
        $aliasName => new \stdClass(),
    ],
],

改為了

'index' => $aliasName.'_0',
'body'  => [
    // 呼叫索引類的 getSettings() 方法獲取索引設定
    'settings' => $indexClass::getSettings(),
    'mappings' => [
        '_doc' => [
            // 呼叫索引類的 getProperties() 方法獲取索引欄位
            'properties' => $indexClass::getProperties(),
        ],
    ],
    'aliases'  => [
        // 同時建立別名
        $aliasName => new \stdClass(),
    ],
],
'include_type_name' => true

再次執行,成功了(流下了激動的眼淚水)~

有課學 -- 程式設計師專屬一站式課程返現平臺,常有課學,常有所獲~

相關文章