2015-11-17 3 views
0

Предположим следующую stockInWarehouse схему:Выберите TOP + GROUP BY + SHORT в Elasticsearch?

{ 
    product_db: { 
    mappings: { 
     stockInWarehouse: { 
     properties: { 
      sku: { 
      type: "string" 
      }, 
      arrivalTime: { 
      type: "date", 
      format: "dateOptionalTime" 
      } 
     } 
     } 
    } 
    } 
} 

Данные в stockInWarehouse выглядят как:

{ 
    "hits": { 
    "total": 5, 
    "hits": [ 
     { 
     "_index": "product_db", 
     "_type": "stockInWarehouse", 
     "_id": "1", 
     "_source": { 
      "sku": "item 1", 
      "arrivalTime": "2015-11-11T19:00:10.231Z" 
     } 
     }, 
     { 
     "_index": "product_db", 
     "_type": "stockInWarehouse", 
     "_id": "2", 
     "_source": { 
      "sku": "item 2", 
      "arrivalTime": "2015-11-12T19:00:10.231Z" 
     } 
     }, 
     { 
     "_index": "product_db", 
     "_type": "stockInWarehouse", 
     "_id": "3", 
     "_source": { 
      "sku": "item 1", 
      "arrivalTime": "2015-11-12T19:35:10.231Z" 
     } 
     }, 
     { 
     "_index": "product_db", 
     "_type": "stockInWarehouse", 
     "_id": "4", 
     "_source": { 
      "sku": "item 1", 
      "arrivalTime": "2015-11-13T19:56:10.231Z" 
     } 
     }, 
     { 
     "_index": "product_db", 
     "_type": "stockInWarehouse", 
     "_id": "5", 
     "_source": { 
      "sku": "item 3", 
      "arrivalTime": "2015-11-15T19:56:10.231Z" 
     } 
     } 
    ] 
    } 
} 

Что я пытаюсь сделать, это выборки TOP документов по ArrivalTime (он же самые последние документы) однако я хочу, чтобы они были , отсортированные по другим полям (sku) и ограничение на доступное sku. Ожидаемый результат будет выглядеть следующим образом:

{ 
    "hits": { 
    "total": 3, 
    "hits": [ 
     { 
     "_index": "product_db", 
     "_type": "stockInWarehouse", 
     "_id": "5", 
     "_source": { 
      "sku": "item 3", 
      "arrivalTime": "2015-11-15T19:56:10.231Z" 
     } 
     }, 
     { 
     "_index": "product_db", 
     "_type": "stockInWarehouse", 
     "_id": "4", 
     "_source": { 
      "sku": "item 1", 
      "arrivalTime": "2015-11-13T19:56:10.231Z" 
     } 
     }, 
     { 
     "_index": "product_db", 
     "_type": "stockInWarehouse", 
     "_id": "2", 
     "_source": { 
      "sku": "item 2", 
      "arrivalTime": "2015-11-12T19:00:10.231Z" 
     } 
     } 
    ] 
    } 
} 

Если я сортировать по arrivalTime, в результате список будет ы содержит item 3, item 1, item 1, item 2, item 1 (дубликат). Если я отсортируюсь по sku, то список результатов не отражает правильное время прибытия.

Возможно ли использовать этот тип запроса в Elasticsearch? Как я могу архивировать это?

+1

Моя догадка заключается в том, что вы можете приблизиться, используя Агрегацию ковша для группировки по sku и стандартную сортировку по заказу по времени прибытия. Вы пробовали это? – Phil

ответ

1

Как насчет этого?

{ 
    "size": 0, 
    "aggs": { 
    "terms_agg": { 
     "terms": { 
     "field": "sku", 
     "size": 100, 
     "order": { 
      "max_date_agg": "desc" 
     } 

     }, 
     "aggs": { 
     "max_date_agg": { 
      "max": { 
      "field": "arrivalTime" 
      } 
     } 
     } 
    } 
    } 
} 

Я сделал size : 100, предполагая, что у вас много продуктов.

Примечание Вам нужно добавить index : not_analyzed к вашему mapping СКУ Это результат запроса

"aggregations": { 
     "terms_agg": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 0, 
     "buckets": [ 
      { 
       "key": "item 3", 
       "doc_count": 1, 
       "max_date_agg": { 
        "value": 1447617370231, 
        "value_as_string": "2015-11-15T19:56:10.231Z" 
       } 
      }, 
      { 
       "key": "item 1", 
       "doc_count": 3, 
       "max_date_agg": { 
        "value": 1447444570231, 
        "value_as_string": "2015-11-13T19:56:10.231Z" 
       } 
      }, 
      { 
       "key": "item 2", 
       "doc_count": 1, 
       "max_date_agg": { 
        "value": 1447354810231, 
        "value_as_string": "2015-11-12T19:00:10.231Z" 
       } 
      } 
     ] 
     } 
    } 

Я надеюсь, что это помогает !!

Смежные вопросы