Как группировать результаты в elasticsearch?
Я храню названия книг в elasticsearch, и все они принадлежат многим магазинам. Вот так:
{
"books": [
{
"id": 1,
"title": "Title 1",
"store": "store1"
},
{
"id": 2,
"title": "Title 1",
"store": "store2"
},
{
"id": 3,
"title": "Title 1",
"store": "store3"
},
{
"id": 4,
"title": "Title 2",
"store": "store2"
},
{
"id": 5,
"title": "Title 2",
"store": "store3"
}
]
}
Как я могу получить все книги и сгруппировать их по названию... и один результат для каждой группы (одна строка с группой с тем же названием, чтобы я мог получить все идентификаторы и магазины)?
на основе данных выше я хочу получить два результата со всеми идентификаторами и магазинами в них.
ожидаемые результаты:
{
"hits":{
"total" : 2,
"hits" : [
{
"0" : {
"title" : "Title 1",
"group": [
{
"id": 1,
"store": "store1"
},
{
"id": 2,
"store": "store2"
},
{
"id": 3,
"store": "store3"
},
]
}
},
{
"1" : {
"title" : "Title 2",
"group": [
{
"id": 4,
"store": "store2"
},
{
"id": 5,
"store": "store3"
}
]
}
}
]
}
}
4 ответов
то, что вы ищете, невозможно в Elasticsearch, по крайней мере, не с текущей версией (1.1).
есть давно выдающийся вопрос для этой функции С большим количеством +1 и спросом за ним.
что касается высказываний: Саймон говорит, это требует много рефакторинга и хотя планируется, нет никакого способа сказать, когда он будет реализован или даже отправлен.
аналогичное заявление было сделано Клинтон Гормли в своем вебинаре, что группировка полей требует много усилий, чтобы быть сделано правильно, тем более, что Elasticsearch является разделенной и распределенной средой по своей природе. Было бы не так много, если бы вы игнорировали sharding, но Elasticsearch хочет поставлять только функции, которые могут масштабироваться с полной системой и работать так же хорошо на сотнях машин, как и на одной коробке.
если вы не привязаны к Elasticsearch,Solr предлагает такие функция.
в противном случае, вероятно, лучшим решением на данный момент является выполнение этой клиентской стороны. То есть, запросите некоторые документы, выполните группировку на клиенте и при необходимости получите еще несколько результатов, чтобы удовлетворить желаемый размер группы (насколько я знаю, это то, что Solr делает под капотом).
не совсем то, что вы хотели, но вы также можете пойти на агрегаты; создайте одно ведро для вашего title
и выполните агрегацию на
вы можете реализовать выше желаемый результат, используя агрегацию в агрегации с top_hits aggs. бывший.
aggs: {
"set": {
"terms": {
field: "id"
},
"aggs": {
"color": {
"terms": {
field: "color"
},
"aggs": {
"products": {
"top_hits": {
_source:{
"include":["size"]
}
}
}
}
},
"product": {
"top_hits": {
_source:{
"include":["productDetails"]
},
size: 1
}
}
}
}
}
Я искал такого рода вещи весь день! ES быстро движется.
взгляните на https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-top-hits-aggregation.html
по аналогии с SQL по ГРУППЫ ПО Elasticsearch в обеспечивает агрегация
с запросами агрегации, Elasticsearch responsds с ведра.
одно ведро соответствует одной категории (группе).