2016-09-20 2 views
0

Elasticsearch не поддерживает управление версиями, поэтому я внедрил его самостоятельно, используя подход №3 от этого замечательного ответа: https://stackoverflow.com/a/8226684/4769188.Получить последние версии каждого документа

Теперь я хочу получить все версии какого-либо типа для диапазона дат [from..to] и взять только одну самую последнюю версию каждого документа. Как я могу это сделать?

+0

Если вы реализовали # 3, то самые последние версии вашего только будет в отдельном указательным права? Почему вы хотите получить все версии, если вы только заботитесь о последних? Или вы имеете в виду все версии, принадлежащие определенному диапазону дат, и среди тех, которые, возможно, старые версии, выбирают самые последние? – jay

+0

@jay Я имею в виду получить все версии, принадлежащие определенному диапазону дат, и среди тех, кто выбирает самые последние. –

ответ

1

Смотрите, если это помогает ...

Я проиндексированы следующие документы:

{ 
    "took": 2, 
    "timed_out": false, 
    "_shards": { 
    "total": 5, 
    "successful": 5, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 4, 
    "max_score": 1, 
    "hits": [ 
     { 
     "_index": "test_index", 
     "_type": "test", 
     "_id": "2", 
     "_score": 1, 
     "_source": { 
      "doc_id": 123, 
      "version": 2, 
      "text": "Foo Bar", 
      "date": "2011-09-01", 
      "current": false 
     } 
     }, 
     { 
     "_index": "test_index", 
     "_type": "test", 
     "_id": "4", 
     "_score": 1, 
     "_source": { 
      "doc_id": 123, 
      "version": 4, 
      "text": "Foo Bar", 
      "date": "2011-07-01", 
      "current": false 
     } 
     }, 
     { 
     "_index": "test_index", 
     "_type": "test", 
     "_id": "1", 
     "_score": 1, 
     "_source": { 
      "doc_id": 123, 
      "version": 1, 
      "text": "Foo Bar", 
      "date": "2011-10-01", 
      "current": true 
     } 
     }, 
     { 
     "_index": "test_index", 
     "_type": "test", 
     "_id": "3", 
     "_score": 1, 
     "_source": { 
      "doc_id": 123, 
      "version": 3, 
      "text": "Foo Bar", 
      "date": "2011-08-01", 
      "current": false 
     } 
     } 
    ] 
    }} 

использовать следующий запрос. Это должно вернуть версию 3 документа. параметр «размер» внутри «top_hits» определяет, сколько документов требуется для каждого ведра. (теперь его значение равно 1).

{ 
    "size" : 0, 
    "query" : { 
     "filtered" : { 
      "query" : { 
       "match_all" : {} 
      }, 
      "filter" : { 
       "range" : { 
        "date" : { 
         "gte" : "2011-07-02", 
         "lte" : "2011-09-01" 
        } 
       } 
      } 
     } 
    }, 
    "aggs" : { 
     "doc_id_groups" : { 
      "terms" : { 
       "field" : "doc_id", 
       "size" : "10", 
       "order" : { 
        "top_score" : "desc" 
       } 
      }, 
      "aggs" : { 
       "top_score" : { 
        "max" : { 
         "script" : "_score" 
        } 
       }, 
       "docs" : { 
        "top_hits" : { 
         "size" : 1, 
         "sort" : { 
          "version" : { 
           "order" : "desc" 
          } 
         }, 
         "fields" : ["doc_id", "version", "date"] 
        } 
       } 
      } 
     } 
    } 
} 
} 

Ответ:

{ 
    "took": 12, 
    "timed_out": false, 
    "_shards": { 
    "total": 5, 
    "successful": 5, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 2, 
    "max_score": 0, 
    "hits": [] 
    }, 
    "aggregations": { 
    "doc_id_groups": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 0, 
     "buckets": [ 
     { 
      "key": 123, 
      "doc_count": 2, 
      "docs": { 
      "hits": { 
       "total": 2, 
       "max_score": null, 
       "hits": [ 
       { 
        "_index": "test_index", 
        "_type": "test", 
        "_id": "3", 
        "_score": null, 
        "fields": { 
        "date": [ 
         "2011-08-01" 
        ], 
        "doc_id": [ 
         123 
        ], 
        "version": [ 
         3 
        ] 
        }, 
        "sort": [ 
        3 
        ] 
       } 
       ] 
      } 
      }, 
      "top_score": { 
      "value": 1 
      } 
     } 
     ] 
    } 
    } 
} 
+0

спасибо, он должен работать. но зачем мне «заказать»: { "top_score": "desc" } ' и агрегация' top_score'? Я получаю ожидаемый результат даже без них –

+0

Вы правы. Этот вид не имеет ничего общего с получением последней версии. Вы можете удалить его. – jay

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