Elasticsearch 深坑覆盤:highlight-fvh-copy to-json 順序的複雜使用場景問題

1、背景情況

業務使用的索引進行了一個切換,從老索引(老集羣)切換到了新索引(新集羣),更改了主分片數目,其他條件未修改。切換當天研發與測試人員都測試通過。

2、問題描述

索引切換的第二天,研發同學反饋查詢使用報錯:

經過初步調試,發現報錯的內容是在 highlight 模塊的 fvh 類型使用,這個操作主要查詢了字段 a-name。

這裏補充一下 highlight 的使用類型知識。

highlight 的高亮處理有三種 unified/plain/fvh,在大文本下比較合適的是 fvh

fvh Highlighter 會直接利用 index 的時候創建的 term vector 來得到高亮片段匹配的查詢分詞,這裏就需要一個 mapping 的配置 "term_vector" : "with_positions_offsets"。

具體的 highlight type 屬性可以參照官方文檔

https://www.elastic.co/guide/en/elasticsearch/reference/current/highlighting.html)

同時,發現了 github 上這個報錯的源碼註釋:

https://github.com/apache/lucene/blob/d5d6dc079395c47cd6d12dcce3bcfdd2c7d9dc63/lucene/highlighter/src/java/org/apache/lucene/search/vectorhighlight/FastVectorHighlighter.java

可以肯定的是 term vector 的計算導致了這個報錯。

還好老索引還在,term vector 也可以使用 api 去查看存儲的信息內容。

GET 索引名/_termvectors/id?fields=字段名

新索引中的搜索關鍵字如下所示:

舊索引中的搜索關鍵字如下所示:

可以明顯看到在新老索引裏,存的position offset兩個信息是完全不一樣的

而嘗試通過 termvector 去實時(on the fly https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-termvectors.html#docs-termvectors-api-generate-termvectors)計算,還是得到的同樣的兩個結果。

現在的問題:相同的文檔信息出現了不同的 term vector 結果

3、排查方向

和研發同學溝通討論後,主要進行了兩方面的排查:

新建測試索引後,我們發現老集羣上的測試索引也有這樣的錯誤。且測試索引的 termvector 信息與新索引信息一致。

因此可以排除集羣環境的問題。

同時研發同學注意到,termvector 信息中出現了本身文檔外的信息:

“text”:["某某科技公司"]
“term_vectors":["mou","ke","ji","gong","si","","科技","公司"]

而多餘的 term vector 信息則來自於另一個存儲拼音的字段 b-name,該字段同時設置了 copy to 屬性,把內容複製給了問題字段 a-name

這時,研發同學發現了問題:在新舊索引切換的過程中,客戶端也進行了更換。之前是 nodejs JSON 上傳,nodejs 的 json 是有序的,而切換後的客戶端使用的是 golang,golang 裏面的 jsoniter 不會有序,排列隨機。

因此不同排序的 json 字段在 copy to 的複雜使用下,產生了不同的 term vector。對此進行了測試索引的故障復現。測試數據如下:

{
"b-name" : "mou mou ke ji gong si",
"a-name" : "某某科技公司",
}

 b-name 在 a-name 之前,term vector 如下:

字段進行調換後:

4、結論與覆盤

實際過程中,我們排查的腦圖如下:

圖片建議放大查看

針對這個複雜的使用場景也是踩了不少坑。真的是魔鬼隱藏在細節裏,json 字段順序的問題也會導致這樣晦澀難找的 bug

同時也遺留了個小問題:term vector 的 api (on the fly)並不能復現這個場景的問題,是因爲計算的是已寫入 lucene 文件的數據,還是模擬的數據寫入?那是不是功能的 bug,還是理解有差?

5、作者介紹

金多安,Elastic 認證工程師,Elastic 資深運維工程師,死磕 Elasticsearch 知識星球嘉賓,星球 Top 活躍技術專家,Elastic 中文社區日報責任編輯

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/lpU2xCM1YR6KS7jJeAnY5g