Как вы суммируете поле сценария с помощью Python'sasticsearch_dsl Search? - PullRequest
0 голосов
/ 25 мая 2018

Это работает для меня правильно:

search = Search(using=client, index='my_index').script_fields(
    special={'script': {
        'source': "<a formula that produces a double>"}
    }
)

И теперь я хочу прикрепить сумму к полю special по всем попаданиям.Я попробовал это:

search = Search(using=client, index='my_index').script_fields(
    special={'script': {
        'source': "<a formula that produces a double>"}
    }
).aggs.metric('total', 'sum', field='special')

Но когда я проверяю атрибут aggs ответа, я получаю

{'total': {'value': 0.0}}

Сам ответ говорит мне, что special заполнен правильно длякаждая запись, и это всегда позитивно.Мне кажется, что special может отсутствовать в тот момент, когда возникает сумма, так что эластичный поиск не видит ее, и поэтому он составляет сумму 0.Я экспериментировал с pipeline вместо metric, но это ничего не изменило.То, что я предлагаю, должно быть возможным, верно?

Я мог бы сделать сумму в моем сценарии, а не черезasticsearch, но я держу пари, что сумма на стороне ES будет намного быстрее.


Обновление

На основании этого обсуждения на форумеasticsearch Я думаю, что нашел способ, которым он должен работать, но он все еще не работает должным образом для меня.Вы предоставляете сценарий внутри агрегации следующим образом:

s=Search(using=client, index='my_index').aggs.pipeline('total', 'sum', script={'source': "<the special formula>"})

Проблема теперь в том, что выходные данные не верны.В тестовом индексе с одним элементом заданного времени я попытался сообщить об этом поле в агрегации сумм, и вместо ожидаемого результата (значения поля) я получил нечто, отличающееся на 128.


Обновление

Я получил ответ на эту последнюю проблему на справочном форумеasticsearch: https://discuss.elastic.co/t/script-aggregation-yields-wrong-but-close-answer/133744/3?u=rschwieb

В двух словах, данные, хранящиеся в поле, были интерпретированы как двойныеasticsearch, но при агрегации использовался тип, определенный отображением для индекса (вместо этого было указано «float»).После повторной индексации поля в виде двойного числа числа соответствуют ожидаемым.

...