2016-05-25 1 views
1

В Elasticsearch я знаю, что могу указать поля, которые я хочу вернуть из документов, соответствующих моему запросу, с помощью {"fields":["fieldA", "fieldB", ..]}.Запросить сумму всех полей в документе, которые соответствуют регулярному выражению, в elasticsearch

Но как мне вернуть сумму всех полей, которые соответствуют определенному регулярному выражению (как новое поле)?

Например, если мои документы выглядеть следующим образом:

{"documentid":1, 
"documentStats":{ 
    "foo_1_1":1, 
    "foo_2_1":5, 
    "boo_1_1:3 
} 
} 

и я хочу сумму все статистики, которые соответствуют _1_ за документ?

ответ

1

Вы можете определить искусственное поле под названием script_field, которое содержит небольшой скрипт Groovy, который будет выполнять эту работу за вас.

Таким образом, после вашего запроса, вы можете добавить script_fields раздел так:

{ 
    "query" : { 
     ... 
    }, 
    "script_fields" : { 
     "sum" : { 
      "script" : "_source.documentStats.findAll{ it.key =~ '_1_'}.collect{it.value}.sum()" 
     } 
    } 
} 

Что скрипт делает это просто, чтобы получить все поля в documentStats имя которого совпадает _1_ и суммирует все свои ценности, в этом кейс, вы получите 4.

Обязательно установите enable dynamic scripting в elasticsearch.yml и перезагрузите узел ES, прежде чем попробовать это.

+0

СПАСИБО ВАС! –

+0

Удивительный, рад, что это помогло! – Val

+0

Еще один вопрос .. Мне удалось использовать script_fields и отсортировать по сценарию, для чего-то более простого. Если documentStats массив "documentStats": [ { "foo_1_1": 1}, { "foo_2_1": 5}, { "boo_1_1: 3} ] как бы я изменяющие заводной сценарий –

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