2015-08-04 3 views
2

В настоящее время я пытаюсь сгруппировать поле на основе одного поля и получить сумму других полей относительно соответствующего поля, используемого для группировки. Я хочу получить новое значение, которое должно быть делением суммированного поля. Я поставлю текущий запрос, который у меня есть:Разделение двух полей в Elasticsearch

В моем запросе я агрегирую их на основе поля («a_name») и суммируя «потратить» и «получить». Я хочу получить новое поле, которое будет отношением суммы (потратить/получить)

Я попытался добавить скрипт, но я получаю NaN, также, чтобы включить это; я должен был дать им первый в elasticsearch.yml файле

script.engine.groovy.inline.aggs: на

Query

GET /index1/table1/_search 
{ 
    "size": 0, 
    "query": { 
    "filtered": { 
     "query": { 
     "query_string": { 
      "query": "*", 
      "analyze_wildcard": true 
     } 
     }, 
     "filter": { 
     "bool": { 
      "must": [ 
      { 
       "term": { 
       "account_id": 29 
       } 
      } 
      ], 
      "must_not": [] 
     } 
     } 
    } 
    }, 
    "aggs": { 
    "custom_name": { 
     "terms": { 
     "field": "a_name" 
     }, 
     "aggs": { 
     "spe": { 
      "sum": { 
      "field": "spend" 
      } 
     }, 
     "gained": { 
      "sum": { 
      "field": "gain" 
      } 
     }, 
     "rati": { 
      "sum": { 
      "script": "doc['spend'].value/doc['gain'].value" 
      } 
     } 
     } 
    } 
    } 
} 

Данный запрос показывает мне 'NaN' в выходе , Если я заменю деление на умножение, запрос будет работать.

По сути то, что я ищу, чтобы разделить два моих агрегаторов «НПП» и «получил»

Благодарности!

ответ

4

Возможно, что doc.gain является 0 в некоторых ваших документах. Вы можете попытаться изменить сценарий вместо этого:

"script": "doc['gain'].value != 0 ? doc['spend'].value/doc['gain'].value : 0" 

UPDATE

Если вы хотите, чтобы вычислить отношение результата двух других метрических агрегатов, вы можете сделать это с помощью bucket_script агрегации (только доступный в ES 2.0, хотя).

{ 
    ... 
    "aggs": { 
    "custom_name": { 
     "terms": { 
     "field": "a_name" 
     }, 
     "aggs": { 
     "spe": { 
      "sum": { 
      "field": "spend" 
      } 
     }, 
     "gained": { 
      "sum": { 
      "field": "gain" 
      } 
     }, 
     "bucket_script": { 
      "buckets_paths": { 
      "totalSpent": "spe", 
      "totalGained": "gained" 
      }, 
      "script": "totalSpent/totalGained" 
     } 
     } 
    } 
    } 
} 
+0

Hi. Спасибо за ответ ! Могу ли я просто делить два моих агрегатора вместо «bucket_path»? –

+0

Также, когда я использую сценарий выше его, не показывая желаемое значение. { "ключ": "прокси", "doc_count": 2325, "рати": { "значение": 219,782931785929 }, "получил": { "значение": 389747,8 }, «спе ": { " value ": 988445.1700000003 } –

+0

Спасибо! Как я буду делать это в ES1.6? –

Смежные вопросы