Как группировать результаты в 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 с ведра.

одно ведро соответствует одной категории (группе).