# Фитрация doc value

**URL:** <https://discuss.elastic.co/t/doc-value/125696>\
**Category:** Вопросы на русском языке\
**Created:** [March 27, 2018, 6:28am UTC](https://discuss.elastic.co/t/doc-value/125696 "2018-03-27T06:28:03Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [March 27, 2018, 6:28am UTC](https://discuss.elastic.co/t/doc-value/125696/1 "2018-03-27T06:28:03Z")

</div>

Доброго времени суток!  
Упражняюсь с doc value - не получается правильно их зафильтровать.  
Задача найти документ соответствующий запросу и отфильтрованными полем.  
Т.е. делаю индекс:

```
{
  "settings" : {
    "number_of_shards" : 1,
    "number_of_replicas" : 0
  },
  "mappings" : {
     "docs" : {
       "properties" : {
         "name" : { "type" : "text"},
         "user" : {
           "properties" : {
             "nickname" : { "type" : "keyword" },
             "level" : { "type" : "integer" }
           }
         }
       }
     }
  }
}

```

Добавляю документ 1:

```
{
  "group" : "Alfa",
  "user" : [
    { "nickname" : "Keken", "level" : 1 },
    { "nickname" : "Elias", "level" : 80 },
    { "nickname" : "Grey", "level" : 2 },
    { "nickname" : "GreenX", "level" : 80 }
  ]
}

```

Добавляю документ 2:

```
{
  "group" : "alfa beta",
  "user" : [
    { "nickname" : "Ken", "level" : 1 },
    { "nickname" : "Barbie", "level" : 2 },
    { "nickname" : "Chalsiea", "level" : 3 }
  ]
}

```

Добавляю документ 3:

```
{
  "group" : "Blacks",
  "user" : [
    { "nickname" : "K", "level" : 80 },
    { "nickname" : "M", "level" : 3 },
    { "nickname" : "J", "level" : 80 }
  ]
}

```

Далее хочу получить группу со словом "alfa" в названии со списком ников 80 левела.

```
{
  "docvalue_fields" : ["user", "user.level" , "user.nickname"],
  "_source" : false,
  "query" : {
    "bool" : {
      "must" : {
        "match": {
          "group" : "alfa"
        }
      },
      "filter" : {
        "term" : { "user.level" : 80}
      }
    }
  }
}

```

Получаю:

```
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.52354836,
    "hits" : [
      {
        "_index" : "test4",
        "_type" : "docs",
        "_id" : "AWJl7jZzTjWVRbbbLEY4",
        "_score" : 0.52354836,
        "fields" : {
          "user.level" : [
            1,
            2,
            80,
            80
          ],
          "user.nickname" : [
            "Elias",
            "GreenX",
            "Grey",
            "Keken"
          ]
        }
      }
    ]
  }
}

```

Т.е. в идеале, я хотел бы получить, что-то вроде:

```
{
   {
    "_id" : 1
    "user" ["Elias","GreenX"]
   }
}

```

Но не получается...

1. Не получилось получить целый объект. Только плоские массивы.
2. Найден правильный документ, но не нужные значения не отфильтровались.
3. Значения в массивах упорядочены по возрастанию, а не так как были. Т.е. их даже дальше в программе не разобрать.

Подскажите, как правильно решают такие задачи?

---

<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:** [March 27, 2018, 1:13pm UTC](https://discuss.elastic.co/t/doc-value/125696/2 "2018-03-27T13:13:58Z")

</div>

> [@GreenX](#):
>
> Подскажите, как правильно решают такие задачи?

С помощью [nested objects](https://www.elastic.co/guide/en/elasticsearch/guide/current/nested-objects.html).

---

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [March 31, 2018, 7:31am UTC](https://discuss.elastic.co/t/doc-value/125696/3 "2018-03-31T07:31:27Z")

</div>

Что-то не получается. Документ-то находит, но поля не выводит.  
Маплю так:

```
{
  "settings" : {
    "number_of_shards" : 1,
    "number_of_replicas" : 0
  },
  "mappings" : {
     "docs" : {
       "properties" : {
         "name" : { "type" : "text"},
         "user" : {
           "type": "nested",
           "properties" : {
             "nickname" : { "type" : "keyword" },
             "level" : { "type" : "integer" }
           }
         }
       }
     }
  }
}

```

Ищу так:

```
{
  "docvalue_fields" : ["user.nickname" , "user", "user.level"],
  "_source" : false,
  "query" : {
    "bool" : {
      "must" : [
        {
          "match": {
            "group" : "alfa"
          }
        },
        {
          "nested": {
            "path": "user",
            "query" : {
              "term" : { 
                "user.level" : 80
              }
            }
          }
        }
      ]
    }
  }
}
```

---

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [March 31, 2018, 3:42pm UTC](https://discuss.elastic.co/t/doc-value/125696/4 "2018-03-31T15:42:54Z")

</div>

А так только первое совпадение выдает:

```
{
  "docvalue_fields" : ["user.nickname" , "user", "user.level"],
  "_source" : false,
  "query" : {
    "bool" : {
      "must" : [
        {
          "match": {
            "group" : "alfa"
          }
        },
        {
          "nested": {
            "path": "user",
              "query" : {
                "term" : { 
                  "user.level" : 80
                }
            }
          }
        }
      ]

    }
  },
  "sort" : [
    {
      "user.nickname" : {
        "nested": {
          "path": "user",
          "filter" : {
            "term" : { "user.level" : 80 }
          }
        }
      }
    }
  ]

}

```

И это совсем не doc value. (Хотя это и не принципиально для достижения цели)

```
{
  "took" : 6,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : null,
    "hits" : [
      {
        "_index" : "test4",
        "_type" : "docs",
        "_id" : "KcHGemIBpbCeB0x8_OAl",
        "_score" : null,
        "sort" : [
          "Elias"
        ]
      }
    ]
  }
}
```

---

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [April 2, 2018, 12:22pm UTC](https://discuss.elastic.co/t/doc-value/125696/5 "2018-04-02T12:22:36Z")

</div>

Похоже понял 🙂 надо через inner\_hits делать. Вечером сформулирую в json.

---

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [April 2, 2018, 6:37pm UTC](https://discuss.elastic.co/t/doc-value/125696/6 "2018-04-02T18:37:10Z")

</div>

Поисковый запрос получился такой:

```
{
  "_source" : false,
  "query" : {
    "bool" : {
      "must" : [
        {
          "match": {
            "group" : "alfa"
          }
        },
        {
          "nested": {
            "path": "user",
              "query" : {
                "term" : { 
                  "user.level" : 80
                }
            },
            "inner_hits" : {
              "size": 100,
              "_source" : false,
              "docvalue_fields" : ["user.nickname"]
            }
          }
        }
      ]
    }
  }
} 

```

Ответ в принципе с теми данными, что я хотел, но уж больно "размашисто". Нет ли способа сократить?

```
{
  "took" : 8,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 1.5235484,
    "hits" : [
      {
        "_index" : "test4",
        "_type" : "docs",
        "_id" : "KcHGemIBpbCeB0x8_OAl",
        "_score" : 1.5235484,
        "inner_hits" : {
          "user" : {
            "hits" : {
              "total" : 2,
              "max_score" : 1.0,
              "hits" : [
                {
                  "_index" : "test4",
                  "_type" : "docs",
                  "_id" : "KcHGemIBpbCeB0x8_OAl",
                  "_nested" : {
                    "field" : "user",
                    "offset" : 3
                  },
                  "_score" : 1.0,
                  "fields" : {
                    "user.nickname" : [
                      "GreenX"
                    ]
                  }
                },
                {
                  "_index" : "test4",
                  "_type" : "docs",
                  "_id" : "KcHGemIBpbCeB0x8_OAl",
                  "_nested" : {
                    "field" : "user",
                    "offset" : 1
                  },
                  "_score" : 1.0,
                  "fields" : {
                    "user.nickname" : [
                      "Elias"
                    ]
                  }
                }
              ]
            }
          }
        }
      }
    ]
  }
}
```

---

<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:** [April 2, 2018, 10:05pm UTC](https://discuss.elastic.co/t/doc-value/125696/7 "2018-04-02T22:05:18Z")

</div>

См. [Response Filtering](https://www.elastic.co/guide/en/elasticsearch/reference/current/common-options.html#common-options-response-filtering).

---

<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:** [April 30, 2018, 10:05pm UTC](https://discuss.elastic.co/t/doc-value/125696/8 "2018-04-30T22:05:31Z")

</div>

Closed on April 30, 2018, 10:05pm UTC

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