Можно ли отфильтровать одно из значений массива записи в эластике

58 views
Skip to first unread message

Max Just

unread,
Apr 6, 2015, 5:29:55 AM4/6/15
to elastics...@googlegroups.com
Добрый день, подскажите существует ли возможность фильтрации значений возвращаемого массива для участия в аггрегации.  То есть, есть запись в эластике, которая содержит несколько полей, одно из них цена. Поле в виде массива и, например, там такие значения: 250 500 700 1500. При аггрегируещем запросе, stats или min / max. Нужно чтобы значение 1500 не участвовало, то есть именно одно из значений поля, а не вся запись целиком. Можно это как-то реализовать или это в принципе не возможно?

Igor Motov

unread,
Apr 7, 2015, 11:25:19 AM4/7/15
to elastics...@googlegroups.com

Max Just

unread,
Apr 28, 2015, 5:31:48 AM4/28/15
to elastics...@googlegroups.com
Игорь, если не затруднит, не могли бы Вы показать пример запроса по выбрасыванию значения? Чтобы хотя бы примерно понять логику построения. 

7 апреля 2015 г., 18:25 пользователь Igor Motov <imo...@gmail.com> написал:
http://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-stats-aggregation.html#_script_5


On Monday, 6 April 2015 18:29:55 UTC+9, Max Just wrote:
Добрый день, подскажите существует ли возможность фильтрации значений возвращаемого массива для участия в аггрегации.  То есть, есть запись в эластике, которая содержит несколько полей, одно из них цена. Поле в виде массива и, например, там такие значения: 250 500 700 1500. При аггрегируещем запросе, stats или min / max. Нужно чтобы значение 1500 не участвовало, то есть именно одно из значений поля, а не вся запись целиком. Можно это как-то реализовать или это в принципе не возможно?

--
Вы получили это сообщение, поскольку подписаны на одну из тем в группе "elasticsearch-ru".
Чтобы отменить подписку на эту тему, перейдите по ссылке https://groups.google.com/d/topic/elasticsearch-ru/st8flTiuCcU/unsubscribe.
Чтобы отменить подписку на эту группу и все ее темы, отправьте письмо на электронный адрес elasticsearch-...@googlegroups.com.
Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес elastics...@googlegroups.com.
Чтобы зайти в группу, перейдите по ссылке http://groups.google.com/group/elasticsearch-ru.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

Max Just

unread,
Apr 28, 2015, 5:55:48 AM4/28/15
to elastics...@googlegroups.com
Тут просто вопрос не в том, чтобы изменить значение уже посчитаной аггрегации (как в примере по ссылке), а исключить значения 1500 и более, чтобы они не вообще участвовали в аггрегации, но другие значения поля в аггрегацию попадали. Пробовал ставить фильтр по полю price (range to 1500), но те документы где price = [50, 100, 1500] (так как поле массив) проходят по фильтру, так как 50 и 100 меньше 1500. А так как документ прошел то, он участвует в stats аггрегации и собственно максимальное значение (stats.max) высчитывается как 1500. Как можно разрешить эту ситуацию?

Igor Motov

unread,
Apr 29, 2015, 11:24:11 AM4/29/15
to elastics...@googlegroups.com
В скрипте вы можете получить массив из записи, выкинуть из него все что не нужно и вернуть меньший массив для последующей аггрегации. 

Max Just

unread,
Apr 29, 2015, 11:39:53 AM4/29/15
to elastics...@googlegroups.com

Это я понял, а как его получить? Я так и не смог найти пример.


ср, 29 апр. 2015, 18:24, Igor Motov <imo...@gmail.com>:
В скрипте вы можете получить массив из записи, выкинуть из него все что не нужно и вернуть меньший массив для последующей аггрегации. 


On Tuesday, 28 April 2015 05:55:48 UTC-4, Max Just wrote:
Тут просто вопрос не в том, чтобы изменить значение уже посчитаной аггрегации (как в примере по ссылке), а исключить значения 1500 и более, чтобы они не вообще участвовали в аггрегации, но другие значения поля в аггрегацию попадали. Пробовал ставить фильтр по полю price (range to 1500), но те документы где price = [50, 100, 1500] (так как поле массив) проходят по фильтру, так как 50 и 100 меньше 1500. А так как документ прошел то, он участвует в stats аггрегации и собственно максимальное значение (stats.max) высчитывается как 1500. Как можно разрешить эту ситуацию?

--

Igor Motov

unread,
Apr 29, 2015, 11:51:17 AM4/29/15
to elastics...@googlegroups.com


On Wednesday, 29 April 2015 11:39:53 UTC-4, Max Just wrote:

Это я понял, а как его получить? Я так и не смог найти пример.


ср, 29 апр. 2015, 18:24, Igor Motov <imo...@gmail.com>:
В скрипте вы можете получить массив из записи, выкинуть из него все что не нужно и вернуть меньший массив для последующей аггрегации. 


On Tuesday, 28 April 2015 05:55:48 UTC-4, Max Just wrote:
Тут просто вопрос не в том, чтобы изменить значение уже посчитаной аггрегации (как в примере по ссылке), а исключить значения 1500 и более, чтобы они не вообще участвовали в аггрегации, но другие значения поля в аггрегацию попадали. Пробовал ставить фильтр по полю price (range to 1500), но те документы где price = [50, 100, 1500] (так как поле массив) проходят по фильтру, так как 50 и 100 меньше 1500. А так как документ прошел то, он участвует в stats аггрегации и собственно максимальное значение (stats.max) высчитывается как 1500. Как можно разрешить эту ситуацию?

--
Вы получили это сообщение, поскольку подписаны на одну из тем в группе "elasticsearch-ru".
Чтобы отменить подписку на эту тему, перейдите по ссылке https://groups.google.com/d/topic/elasticsearch-ru/st8flTiuCcU/unsubscribe.
Чтобы отменить подписку на эту группу и все ее темы, отправьте письмо на электронный адрес elasticsearch-ru+unsubscribe@googlegroups.com.
Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес elasticsearch-ru@googlegroups.com.

Max Just

unread,
Apr 29, 2015, 3:49:42 PM4/29/15
to elastics...@googlegroups.com
Чего то я совсем туплю, вот код который прогнал на груви и все работает: 
[1022230041500];
c.removeAll it >= 1500  
println c;

Прогоняю его на ластике вот в таком формате 
 "aggs": {
    "scripted": {
      "stats": {
        "script": "doc['price'].values.removeAll {it > 1500}"
      }
    },
    "direct": {
      "stats": {
        "field": "price"
      }
    }
  }

И получаю вот такую ошибку  GroovyScriptExecutionException[UnsupportedOperationException[null]]; "

29 апреля 2015 г., 18:51 пользователь Igor Motov <imo...@gmail.com> написал:


On Wednesday, 29 April 2015 11:39:53 UTC-4, Max Just wrote:

Это я понял, а как его получить? Я так и не смог найти пример.


ср, 29 апр. 2015, 18:24, Igor Motov <imo...@gmail.com>:
В скрипте вы можете получить массив из записи, выкинуть из него все что не нужно и вернуть меньший массив для последующей аггрегации. 


On Tuesday, 28 April 2015 05:55:48 UTC-4, Max Just wrote:
Тут просто вопрос не в том, чтобы изменить значение уже посчитаной аггрегации (как в примере по ссылке), а исключить значения 1500 и более, чтобы они не вообще участвовали в аггрегации, но другие значения поля в аггрегацию попадали. Пробовал ставить фильтр по полю price (range to 1500), но те документы где price = [50, 100, 1500] (так как поле массив) проходят по фильтру, так как 50 и 100 меньше 1500. А так как документ прошел то, он участвует в stats аггрегации и собственно максимальное значение (stats.max) высчитывается как 1500. Как можно разрешить эту ситуацию?

--
Вы получили это сообщение, поскольку подписаны на одну из тем в группе "elasticsearch-ru".
Чтобы отменить подписку на эту тему, перейдите по ссылке https://groups.google.com/d/topic/elasticsearch-ru/st8flTiuCcU/unsubscribe.
Чтобы отменить подписку на эту группу и все ее темы, отправьте письмо на электронный адрес elasticsearch-...@googlegroups.com.
Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес elastics...@googlegroups.com.

Чтобы зайти в группу, перейдите по ссылке http://groups.google.com/group/elasticsearch-ru.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
Вы получили это сообщение, поскольку подписаны на одну из тем в группе "elasticsearch-ru".
Чтобы отменить подписку на эту тему, перейдите по ссылке https://groups.google.com/d/topic/elasticsearch-ru/st8flTiuCcU/unsubscribe.
Чтобы отменить подписку на эту группу и все ее темы, отправьте письмо на электронный адрес elasticsearch-...@googlegroups.com.
Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес elastics...@googlegroups.com.

Max Just

unread,
Apr 29, 2015, 4:17:22 PM4/29/15
to elastics...@googlegroups.com
В общем вдруг кому понадобиться, решил вот так  "script": "def s = [];doc['price'].values.each {if(it > 6000) s.push(it);};return s;"} так как я понял, что doc[''].values это unmodified. Если кто-нибудь из экспертов даст комментарий верное это решние или нет, то буду очень благодарен. Более всего конечно интересует вопрос оптимизации, можно ли как-то еще ускорить этот скрипт?
 
Reply all
Reply to author
Forward
0 new messages