2015-09-14 42 views
2

我已經在elasticsearch上映射了一個名爲measure的類型,它包含sensorId和value作爲字符串。Sum Aggregation忽略負值

映射。

{ 
    "measures": { 
     "mappings": { 
      "summarizedmeasure": { 
       "properties": { 
        "sensorId": { 
         "type": "string" 
        } 
        "timestamp": { 
         "type": "date", 
         "format": "dateOptionalTime" 
        }, 
        "value": { 
         "type": "string" 
        } 
       } 
      } 
     } 
    } 
} 

有一些負值索引,但是當我計算總和天數它給予正值。

{ 
    "query": { 
    "bool": { 
     "must": 
     { 
      "match": { 
      "sensorId": "123" 
      } 
     } 
    } 
    }, 
    "aggs": { 
    "value_per_day": { 
     "date_histogram": { 
     "field": "timestamp", 
     "interval": "day" 
     }, 
     "aggs": { 
     "total": { 
      "sum": { 
      "script": "Float.parseFloat(doc['value'].value)" 
      } 
     } 
     } 
    } 
    } 
} 

請幫我解決這個問題。謝謝

+0

你能給我一些樣本文檔也與課程負值過的。 –

回答

2

你映射

   "value": { 
        "type": "string" 
       } 

需要使用index: not_analyzed或分析值去除-(減號)。 Elasticsearch中的默認分析器 - standard - 刪除一些字符並降低字符串(等等)。

對於下面的映射,腳本按預期工作:

"value": { 
     "type": "string", 
     "index": "not_analyzed" 
    } 

或者,但我認爲這甚至比普通的腳本更昂貴,是使用_source對象在腳本中,因爲一個包含這是索引的原文:

"script": "Float.parseFloat(_source.value)"

+0

有沒有任何方法可以在不重新映射我的類型的情況下刪除或忽略分析器? elasticsearch實例處於生產環境中。 – Sapikelio

+0

您可以通過將字段設置爲多字段(在[本博客文章]中查找「升級到多字段」)來改變映射(https://www.elastic.co/blog/changing- (PUT /度量/彙總度量/ _映射 「彙總度量」):{ 「屬性」:{ 「value」:{ 「type」 : 「串」, 「字段」:{ 「原始」:{ 「類型」: 「串」, 「索引」: 「not_analyzed」 } } } } } }')將只對新索引文件有效 –

+0

如果你想改變這個已經存在的文件,你需要重新索引它們,沒有別的選擇。 –