具體情況是這樣的
跟著課程裡面學習 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
再次執行,成功了(流下了激動的眼淚水)~