2017-02-17 5 views
0

У меня есть это отображение модели в моем индексе elasticsearch:результаты Elasticsearch, заказанные и сгруппированных BY

{ 
    "my_index": { 
    "mappings": { 
     "vehicules": { 
     "properties": { 
      "name": { 
      "type": "text" 
      }, 
      "category_id": { 
      "type": "integer" 
      }, 
      "price": { 
      "type": "float" 
      }, 
     } 
     } 
    } 
    } 
} 

В этом индексе, у меня вставить некоторые демо-данные:

+--------------+-------------+-------+ 
|  Name  | Category ID | Price | 
+--------------+-------------+-------+ 
| Car 1  |   1 | 1500 | 
| Car 2  |   1 | 4000 | 
| Car 3  |   1 | 2500 | 
| Motorcycle 1 |   2 | 3000 | 
| Motorcycle 2 |   2 | 1400 | 
| Motorcycle 3 |   2 | 2700 | 
| Truck 1  |   3 | 19000 | 
| Truck 2  |   3 | 15000 | 
+--------------+-------------+-------+ 

Я хотел бы сортировать весь продукт по цене ASC и группировать результаты по категориям. Сами категории должны быть отсортированы с ценовой стоимостью ее дочерних данных. Какие дают:

{ 
    "2": [  <= Category where the price start with lower price (1400) 
     { 
      "name": "Motorcycle 2", 
      "price": 1400 
     }, 
     { 
      "name": "Motorcycle 3", 
      "price": 2700 
     }, 
     { 
      "name": "Motorcycle 1", 
      "price": 3000 
     } 
    ], 
    "1": [ 
     { 
      "name": "Car 1", 
      "price": 1500 
     }, 
     { 
      "name": "Car 3", 
      "price": 2500 
     }, 
     { 
      "name": "Car 2", 
      "price": 4000 
     } 
    ], 
    "3": [ 
     { 
      "name": "Truck 2", 
      "price": 15000 
     }, 
     { 
      "name": "Truck 1", 
      "price": 19000 
     } 
    ] 
} 

Возможно ли иметь такие результаты или что-то близкое к нему с ES? Я очень новичок в ES, и я пробовал много разных запросов в DevTool Kibana, но безуспешно.


Я думаю, что нашел запрос, чтобы получить желаемый результат. Я не уверен, что он полностью оптимизирован, но он работает.

GET my_index/my_type/_search 
{ 
    "size": 0, 
    "aggs": { 
    "grouped_by_cat": { 
     "terms": { 
     "field": "category_id", 
     "order": { 
      "min_price_aggs": "asc" 
     } 
     }, 
     "aggs": { 
     "min_price_aggs": { 
      "min": { 
      "field": "price" 
      } 
     }, 
     "list_top_hits": { 
      "top_hits": { 
      "_source": { 
       "includes": [ 
       "name", 
       "price" 
       ] 
      }, 
      "sort": [ 
       { 
       "price": { 
        "order": "asc" 
       } 
       } 
      ], 
      "size": 10000 
      } 
     } 
     } 
    } 
    } 
} 

Этот запрос кажется вам правильным?

+0

Какая версия ElasticSearch вы используете? –

+0

Я использую ES v5.2. Я буду обновлять, может ответить с запросом, который возвращает результаты, которые я хочу. – Gaius

ответ

0

Таким образом, вы можете достичь выше результата на следующий запрос

GET my_index/vehicles/_search 
{ 
"size": 0, 
"aggs" : { 
    "category_id_aggs": { 
     "terms" : { 
      "field" : "category_id" 
     }, 
     "aggs": { 
      "data": { 
       "top_hits": { 
        "size": 10, 
        "sort": [{"price":"asc"}], 
        "_source": { 
         "includes" : ["name","price"] 
        } 
       } 
      } 
     } 
    } 
    } 
}