# Сортировка скриптом в nested объектах

**URL:** <https://discuss.elastic.co/t/nested/157481>\
**Category:** Вопросы на русском языке\
**Created:** [November 20, 2018, 6:48am UTC](https://discuss.elastic.co/t/nested/157481 "2018-11-20T06:48:00Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![bio](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/bio/32/76409_2.png) [@bio](https://discuss.elastic.co/u/bio)\
**Post date:** [November 20, 2018, 6:48am UTC](https://discuss.elastic.co/t/nested/157481/1 "2018-11-20T06:48:00Z")

</div>

Добрый день!  
Стоит задача отсортировать товары по сумме включая ндс, но по одной валюте.  
У товара может быть несколько цен, одна цена - одна валюта. При этом у товара может не быть нужной валюты, в таком случа у товара цена должна быть 0.

> **Настройки индекса и запрос**
>
> ```auto
> PUT my_index
> {
> "mappings": {
> "_doc": {
> "properties": {
> "product": {
> "properties": {
> "vat": {
> "properties": {
> "id": {
> "type": "long"
> },
> "percent": {
> "type": "double"
> }
> }
> },
> "prices": {
> "type": "nested",
> "properties": {
> "currency_id": {
> "type": "long"
> },
> "position": {
> "type": "long"
> },
> "price": {
> "type": "double"
> },
> "product_id": {
> "type": "long"
> }
> }
> }
> }
> }
> }
> }
> }
> }
> 
> PUT my_index/_doc/1
> {
> "product": {
> "vat" : {
> "id" : 1,
> "percent" : 10
> },
> "prices": [
> {
> "product_id": 1,
> "currency_id": 39,
> "price": 2081,
> "position": 0
> },
> {
> "product_id": 1,
> "currency_id": 9,
> "price": 1021,
> "position": 1
> }
> ]
> }
> }
> 
> PUT my_index/_doc/2
> {
> "product": {
> "vat" : {
> "id" : 1,
> "percent" : 20
> },
> "prices": [
> {
> "product_id": 2,
> "currency_id": 39,
> "price": 100,
> "position": 0
> },
> {
> "product_id": 2,
> "currency_id": 9,
> "price": 200,
> "position": 1
> }
> ]
> }
> }
> 
> PUT my_index/_doc/3
> {
> "product": {
> "vat" : {
> "id" : 1,
> "percent" : 15
> },
> "prices": [
> {
> "product_id": 2,
> "currency_id": 19,
> "price": 500,
> "position": 0
> }
> ]
> }
> }
> 
> GET my_index/_search
> {
> "sort": {
> "_script" : {
> "type":"string",
> "order" : "desc",
> "nested" : {
> "path" : "product.prices",
> "filter" : {
> "term" : {
> "product.prices.currency_id": 39
> }
> } 
> },
> "script" : {
> "source" : """
> def price = doc['product.prices.price'].value;
> def vat = doc['product.vat.percent'].value; 
>         
> Debug.explain([price, vat]);
> 
> return price + (price*vat/100);
>         
> """
> }
> }
> }
> }
> 
> ```

Из за nested запроса в сортировке не могу достучаться до ндс товара.  
Если убрать nested запрос, то не могу достучаться до цен.

Как получить доступ к нужным данным ?

Ещё вопрос, если в сортировке поставить type=number, то результат документов которых исключил фильтр будет 1.7976931348623157e+308, эти документы не попадают под скрипт что бы установить им 0, параметр missing не доступен если используются скрипты. Как в таком случае устанавливать значение ?

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [November 20, 2018, 2:59pm UTC](https://discuss.elastic.co/t/nested/157481/2 "2018-11-20T14:59:26Z")

</div>

А сколько у Вас этих разных валют в системе ожидается?

---

<div class="post-metadata">

**Author:** ![bio](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/bio/32/76409_2.png) [@bio](https://discuss.elastic.co/u/bio)\
**Post date:** [November 21, 2018, 4:58am UTC](https://discuss.elastic.co/t/nested/157481/3 "2018-11-21T04:58:17Z")

</div>

Общее кол-во валют 50, но не все из них используются. Сейчас используется 9 валют, остальные по мере необходимости будут "включаться" для пользования.

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [November 21, 2018, 1:58pm UTC](https://discuss.elastic.co/t/nested/157481/4 "2018-11-21T13:58:55Z")

</div>

Я бы, наверное, не стал делать этот как nested. Я думаю, что-то типа

```auto
{
  "product": {
    "prices": {
      "eur": {
        "price": 100,
        "price_with_vat": 110
      },
      "gpd": {
        "price": 200,
        "price_with_vat": 220
      }
    }
  }
}

```

Будет гораздо эффективнее и проще.

---

<div class="post-metadata">

**Author:** ![bio](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/bio/32/76409_2.png) [@bio](https://discuss.elastic.co/u/bio)\
**Post date:** [December 4, 2018, 6:08am UTC](https://discuss.elastic.co/t/nested/157481/5 "2018-12-04T06:08:08Z")

</div>

Спасибо, примерно так и сделал.  
То что у меня не получалось, это такая особенность или я что-то не правильно делал ?

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [December 4, 2018, 2:39pm UTC](https://discuss.elastic.co/t/nested/157481/6 "2018-12-04T14:39:23Z")

</div>

> [@bio](#):
>
> То что у меня не получалось, это такая особенность или я что-то не правильно делал ?

С nested все не так просто. Если в документе есть nested объекты, то эти объекты индексируются как отдельные скрытые документы, и когда скрипт запускается, то в зависимости от типа скрипта, он видит либо основной документ, либо этот скрытый nested документ. В вашем случае скрипт работал на родительском документе.

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [January 1, 2019, 2:39pm UTC](https://discuss.elastic.co/t/nested/157481/7 "2019-01-01T14:39:31Z")

</div>

Closed on January 1, 2019, 2:39pm UTC

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
