我們有一個過程,我們的 Web 服務在 ElasticSearch(C#,使用 NEST)中創建日志記錄。ES 索引名稱包括月份和年份。聚合程序(C#,不使用 NEST)從各種日志中提取近乎實時的信息。它由日期直方圖、一些項(主機、ip 等)和一些整數字段的總和組成。它發出類似這樣的請求:{ "size":0, "query": { "range":{"date":{"gt":"2018-10-01T00:00:00","lte":"2018-10-01T01:00:00"}} }, "aggs": { "myBuckets": { "composite": { "size":100, "sources": [ {"host":{"terms":{"field":"host.keyword","missing":""}}}, {"ipAddress":{"terms":{"field":"ipAddress.keyword","missing":""}}}, {"date":{"date_histogram":{"field":"date","interval":"1h"}}} ] }, "aggregations": { "records":{"sum":{"field":"records","missing":0}} } } }}問題在于這些整數字段,因為偶爾流氓/錯誤 Web 服務會使用字符串而不是整數。這會導致 ES 更改字段的索引映射(從整數到字符串),并破壞聚合器。通過重新索引來修復索引不是一種選擇,如果可能的話,我們更愿意即時處理這個問題。我目前的計劃是讀取索引的映射并將求和聚合切換為類似于以下的無痛腳本:doc['badField.keyword'].value!=null ? Integer.parseInt(doc['badField.keyword'].value) : 0有沒有更好的方法來處理這種情況?如果沒有,是否有更強大的整數轉換腳本方法?
1 回答

幕布斯6054654
TA貢獻1876條經驗 獲得超7個贊
... ES 改變索引對字段的映射
ES 永遠不會改變一個字段的映射,一旦它被創建。發生這種情況的唯一方法是,如果您發送的第一條記錄具有字符串值而不是整數值。
您可以通過在索引第一條記錄之前使用創建索引模板來輕松克服這個問題:
PUT _template/my-template
{
"index_patterns": ["my-index*"],
"mappings": {
"_doc": {
"properties": {
"my_integer_field": {
"type": "integer" <---- this will always be honored
"ignore_malformed": true <---- ignore if the value really isn't an integer
}
}
}
}
}
- 1 回答
- 0 關注
- 138 瀏覽
添加回答
舉報
0/150
提交
取消