как агрегировать результаты и создавать массивы на определенных полях - PullRequest
0 голосов
/ 08 апреля 2019

Я новичок вasticsearch и не знаю, с чего начать.

Вот мои данные в ES:

[{
  product_id: "xxxyyyxx",
  shop_id: "shop1",
  name: "Elastic testing",
  creator: "Test 1337",
  price: 13
},
{
  product_id: "xxxyyyxx",
  shop_id: "shop2",
  name: "Elastic testing",
  creator: "Test 1337",
  price: 10
}]

Что я хочу получить

{
  product_id: "xxxyyyxx",
  shops: ['shop1', 'shop2'],
  name: "Elastic testing",
  creator: "Test 1337",
  min_price: 10,
  max_price: 13
}

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

query: {
  multi_match: {
    query: 'test',
    fields: ['creator', 'name', 'info']
  }
}

, если вы можете указать мне правильное направление, с чего начать, очень признателен.

Ответы [ 2 ]

2 голосов
/ 08 апреля 2019

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

Агрегации определяются вне запроса, совпадения для вашего запроса используются в качестве входных данных.

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

Что касается shopIds, вам потребуется вложить еще одно объединение сегментов, которое предоставит вам сегмент для каждого отдельного значения shopId полей, содержащего все документы с этим значением.

Пример:

"query": { //your query here ...},
    "aggs" : {
        "name_term" : {
            "terms" : { "field" : "name" },
            "aggs" : {
                "max_price" : { "max" : { "field" : "price" } },
                "min_price" : { "min" : { "field" : "price" } },
                "shops" : {
                    "terms" : { "field" : "shop_id" }
                }
            } 
        }
    }
0 голосов
/ 08 апреля 2019

создание массива идентификаторов объявляется так же, как объявление нормального поля:

"product_id": {
    "type": "keyword",
    "store": "true",
    "index": "true"
}

Просто убедитесь, что ваш массив назван как product_id в вашем классе:

List<String> product_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...