Я новичок в 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']
}
}
если вы можете указать мне правильное направление, с чего начать, очень признателен.
Загляните в агрегаты. Существуют агрегаты, которые группируют ваши данные в так называемые ведра, и агрегаты, которые вы можете использовать в этих корзинах для расчета показатели. Примером метрики может быть ваша потребность в минимальной и максимальной цене. Вы можете вкладывать агрегации, чтобы получить желаемый результат.
Агрегации определяются вне запроса, совпадения для вашего запроса используются в качестве входных данных.
В вашем случае вы можете использовать агрегацию терминов в поле имени, это предоставит вам ведро для каждого имени. Если вы затем используете метрику для максимального и минимального значений в этом сегменте, часть желаемого результата уже есть.
Что касается 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" }
}
}
}
}
Конечно! я добавил это в свой ответ.
спасибо за обновление вашего ответа. Я получаю сообщение об ошибке, когда пытаюсь просто запустить 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.
можете ли вы также привести пример сопоставления? Большое спасибо за вашу помощь :-)
не могли бы вы предоставить мне ваш запрос? Похоже, вы пытаетесь агрегировать создателя, который представляет собой поле полнотекстового поиска (они анализируются, значит, значения хранятся в разделенных терминах в инвертированном индексе). Если вы хотите провести агрегацию по полю, лучше использовать для него сопоставление ключевых слов.
Я хочу агрегировать по нескольким полям, например. product_id, создатель, имя и информация и иметь shop_ids в массиве, а также минимальную и максимальную цену. Я просто попытался сначала проверить это с создателем без запроса, например. aggs: { products: { terms: { field: 'creator' } } }
Я смог заставить его работать по большей части, но не в массиве shop_id. Но использование agg top_hits
возвращает источник каждой записи, поэтому я могу просмотреть их, чтобы создать свой массив. Большое спасибо за вашу помощь. Вы определенно облегчили мою кривую обучения эластичному поиску.
создание массива идентификаторов объявляется так же, как и объявление обычного поля:
"product_id": {
"type": "keyword",
"store": "true",
"index": "true"
}
Просто убедитесь, что ваш массив называется product_id в вашем классе:
List<String> product_id
спасибо за ваш ответ, я пытаюсь получить массив идентификаторов из совокупности запрошенных документов. Не могли бы вы расширить свой ответ.
спасибо за ваш ответ, есть ли у вас какие-либо идеи о создании массива идентификаторов магазинов?