Как агрегировать результаты и создавать массивы в определенных полях

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

Вот мои данные в 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']
  }
}

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

0
0
58
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

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

Что касается shopId, вам нужно будет вложить еще одну агрегацию корзин, которая предоставит вам ведро для каждого отдельного значения поля 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" }
                }
            } 
        }
    }

спасибо за ваш ответ, есть ли у вас какие-либо идеи о создании массива идентификаторов магазинов?

James Burke 08.04.2019 20:04

Конечно! я добавил это в свой ответ.

aHochstein 09.04.2019 07:55

спасибо за обновление вашего ответа. Я получаю сообщение об ошибке, когда пытаюсь просто запустить aggs для одного поля «создатель» Fielddata is disabled on text fields by default. Set fielddata=true on [creator] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead. можете ли вы также привести пример сопоставления? Большое спасибо за вашу помощь :-)

James Burke 09.04.2019 08:31

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

aHochstein 09.04.2019 08:34

Я хочу агрегировать по нескольким полям, например. product_id, создатель, имя и информация и иметь shop_ids в массиве, а также минимальную и максимальную цену. Я просто попытался сначала проверить это с создателем без запроса, например. aggs: { products: { terms: { field: 'creator' } } }

James Burke 09.04.2019 09:22

Я смог заставить его работать по большей части, но не в массиве shop_id. Но использование agg top_hits возвращает источник каждой записи, поэтому я могу просмотреть их, чтобы создать свой массив. Большое спасибо за вашу помощь. Вы определенно облегчили мою кривую обучения эластичному поиску.

James Burke 09.04.2019 14:12

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

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

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

List<String> product_id

спасибо за ваш ответ, я пытаюсь получить массив идентификаторов из совокупности запрошенных документов. Не могли бы вы расширить свой ответ.

James Burke 08.04.2019 21:02

Другие вопросы по теме