ES動態對映導致的線上疑案

2021-08-21 01:46:29 字數 1763 閱讀 6764

但是奇怪的地方在於:同樣的**和配置進行上線,線下測試過沒有問題,一上線卻出了問題,於是立即進行問題的排查,以確保找到根本原因,保證下次上線的順利。

1. 首先定位**問題

對用於上線打包的**和線下的**(包括配置檔案)進行了diff,發現**確實是最新**,配置也是相應的一致,說明不是有**漏提上線的問題

2. 檢視環境設定問題

進行了es schema的check。線上出現了es報錯因為確實兩個中間過渡字段,那麼線下是否也沒有那兩個過渡欄位呢?

在sense執行查詢es 該倒排索引的對映結構

很奇怪的事情被發現了,線下測試使用者使用的索引別名竟然自己把中間的過渡欄位給加上了,非測試使用者的索引別名還是沒有中間過渡欄位的

於是開始查詢為啥線下es 會自己給測試使用者的索引別名加上過渡字段,而導致線下的測試沒有暴露出問題。

3. 懷疑是線下匯入全量資料同步欄位給es了4. 懷疑是es設定不一致的問題

現在懷疑到可能是線下es有許可權加上中間過渡字段,於是**給自動同步過去,但是線上es沒有許可權隨便增加字段,於是**沒有同步成功。於是問了下有es豐富開發經驗,fusion模組的創始的大牛前輩,雖然我的想法是不對的,但是他提醒了我es有動態設定這麼一種設定。於是我離開回去查了下官方推薦的權威指南,果然找到了最終原因

5. 查詢官方權威指南

我查閱到了elasticsearch 的dynamic屬性

幸運的是可以用 dynamic 配置來控制這種行為 ,可接受的選項如下:

true 動態新增新的字段–預設

false 忽略新的字段

strict 如果遇到新字段丟擲異常

配置引數 dynamic 可以用在根 object 或任何 object 型別的字段上。你可以將 dynamic 的預設值設定為 strict , 而只在指定的內部物件中開啟它, 例如:

put /my_index

, "stash": }}

}}

拷貝為 curl在 sense 中檢視 ,如果遇到新字段,物件 my_type 就會丟擲異常。

而內部物件 stash 遇到新字段就會動態建立新字段。

使用上述動態對映, 你可以給 stash 物件新增新的可檢索的字段:

put /my_index/my_type/1

}

拷貝為 curl在 sense 中檢視

但是對根節點物件 my_type 進行同樣的操作會失敗:

put /my_index/my_type/1

拷貝為 curl在 sense 中檢視

注意把 dynamic 設定為 false 一點兒也不會改變 _source 的字段內容。 _source 仍然包含被索引的整個json文件。只是新的字段不會被加到對映中也不可搜尋。

6. 確認問題

為了確認是否是這個問題,於是立即在sense上檢視了線上和線下的索引schema關於dynamic的設定

get index
7. 問題解決

由於線上es服務的依賴方較多,之前的配置最好是不要輕易修改,於是後來修改了線上es的schema把那幾個中間字段加上了。加上後問題得到解決。

es5的動態計算屬性

近來在使用vuex的時候為了統一管理操作state的變數,將所有變數集中式宣告放在了乙個檔案下,引入後用到了es5的動態計算屬性獲取變數,感覺棒棒的,之前物件字面量不能使用變數,有了計算屬性可以使用了。import types from const mutations 以上就是乙個mutaions的...

5 高階之使用動態對映模板定製自己的對映策略

預設的動態對映的效果咋樣 put my index my type 1 test string 這個就是es的預設的動態對映規則,可能就不是我們想要的。test number 如果是個數字,我們希望預設就是integer型別的 test string 如果是字串,我們希望預設是個text,這個沒問題...

核心中的2套虛擬位址對映方法 動態對映和靜態對映

靜態對映 1 核心移植時以 的形式硬編碼 裡已經把它寫固定了,即移植的時候已經設計好了要把哪個物理位址對映哪個虛擬位址 如果要更改的話必須改源 後重新編譯核心。開機時呼叫對映表建立函式,對映表建立函式。該函式根據對映表來建立linux核心的頁表對映關係。start kernel setup arch...