0

Я новичок в поиске elasticsearch, у вас есть идея о том, как делать фильтры, запросы и агрегацию, но не знаете, как решить эту следующую проблему ниже. Я хочу иметь возможность запрашивать только последние поставки (date и crate_quantity) компаний из документа, показанного ниже. Я не уверен, как это сделать. Есть ли способ использовать максимальную агрегацию, чтобы извлекать только самые последние поставки из каждого документа?elasticsearch запрос вложенного документа

POST /sanfrancisco/devlivery 
{ 
"company1": { 
    "delivery": [ 
     { 
      "date": "01/01/2013", 
      "crate_quantity": 5 
     }, 
     { 
      "date": "01/12/2013", 
      "crate_quantity": 3 
     }, 
     { 
      "date": "01/24/2013", 
      "crate_quantity": 2 
     } 
    ] 
} 
} 

POST /sanfrancisco/devlivery 
{ 
"company2": { 
    "delivery": [ 
     { 
      "date": "01/01/2015", 
      "crate_quantity": 14 
     }, 
     { 
      "date": "12/31/2014", 
      "crate_quantity": 20 
     }, 
     { 
      "date": "11/24/2014", 
      "crate_quantity": 13 
     } 
    ] 
} 
} 
+0

Вы должны использовать эту конкретную схему? Если вы можете изменить схему (сопоставление), тогда существует несколько способов решения проблемы. –

+0

Я не добавлял никакой схемы к этому. Вы имеете в виду отображение? Есть ли какой-то конкретный способ сопоставить это? – codeBarer

+0

Вы запрашиваете конкретные компании или хотите вернуть самую последнюю поставку для каждой компании? –

ответ

0

Если вы хотите последнюю поставку для одной компании в то время, я бы, вероятно, установить его с помощью parent/child отношения. Я использовал company как родительский и delivery как ребенок.

Я также добавил custom date format, чтобы ваши даты были отсортированы так, как вы ожидали.

Я создал индекс так:

DELETE /test_index 

PUT /test_index 
{ 
    "settings": { 
     "number_of_shards": 1, 
     "number_of_replicas": 0 
    }, 
    "mappings": { 
     "company": { 
     "properties": { 
      "name": { 
       "type": "string", 
       "index": "not_analyzed" 
      } 
     } 
     }, 
     "delivery": { 
     "_parent": { 
      "type": "company" 
     }, 
     "properties": { 
      "crate_quantity": { 
       "type": "long" 
      }, 
      "date": { 
       "type": "date", 
       "format": "MM/dd/yyyy" 
      } 
     } 
     } 
    } 
} 

затем индексированных документы с помощью bulk api:

PUT /test_index/_bulk 
{"index": {"_index":"test_index", "_type":"company", "_id":1}} 
{"name":"company1"} 
{"index": {"_index":"test_index", "_type":"delivery", "_id":1, "_parent":1}} 
{"date": "01/01/2013", "crate_quantity": 5} 
{"index": {"_index":"test_index", "_type":"delivery", "_id":2, "_parent":1}} 
{"date": "01/12/2013", "crate_quantity": 3} 
{"index": {"_index":"test_index", "_type":"delivery", "_id":3, "_parent":1}} 
{"date": "01/24/2013", "crate_quantity": 2} 
{"index": {"_index":"test_index", "_type":"company", "_id":2}} 
{"name":"company2"} 
{"index": {"_index":"test_index", "_type":"delivery", "_id":4, "_parent":2}} 
{"date": "01/01/2015", "crate_quantity": 14} 
{"index": {"_index":"test_index", "_type":"delivery", "_id":5, "_parent":2}} 
{"date": "12/31/2014", "crate_quantity": 20} 
{"index": {"_index":"test_index", "_type":"delivery", "_id":6, "_parent":2}} 
{"date": "11/24/2014", "crate_quantity": 13 } 

Теперь я могу запросить последнюю поставку для конкретной компании с помощью has_parent filter , сортировка по дате и только принятие единственного результата, а именно:

POST /test_index/delivery/_search 
{ 
    "size": 1, 
    "sort": [ 
     { 
     "date": { 
      "order": "desc" 
     } 
     } 
    ], 
    "filter": { 
     "has_parent": { 
     "type": "company", 
     "query": { 
      "term": { 
       "name": { 
        "value": "company1" 
       } 
      } 
     } 
     } 
    } 
} 
... 
{ 
    "took": 2, 
    "timed_out": false, 
    "_shards": { 
     "total": 1, 
     "successful": 1, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 3, 
     "max_score": null, 
     "hits": [ 
     { 
      "_index": "test_index", 
      "_type": "delivery", 
      "_id": "3", 
      "_score": null, 
      "_source": { 
       "date": "01/24/2013", 
       "crate_quantity": 2 
      }, 
      "sort": [ 
       1358985600000 
      ] 
     } 
     ] 
    } 
} 

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

http://sense.qbox.io/gist/c519b0654448c8b7b0c7c85d613f1e88c0ad1d19