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