Запрос Elasticsearch для возврата самого последнего «каждого документа» на основе условия - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь получить самую последнюю версию каждого документа в моем наборе данных, когда документ еще не заархивирован (archived: false). Поэтому, когда любая версия документа имеет значение true, она не должна отображаться в моем результате.

Пример моего набора данных:

 {
    name: "soccer game",
    base_id: 1,
    hours_remaining: 10,
    updatedDate: 2019 - 03 - 10,
    archived: false
}

{
    name: 'basketball game",
    base_id: 2,
    hours_remaining: 20,
    updatedDate: 2019 - 03 - 10,
    archived: false
}

{
    name: "soccer game",
    base_id: 1,
    hours_remaining: 5,
    updatedDate: 2019 - 03 - 14,
    archived: true
}

Ожидаемый результат:

{
    name: 'basketball game",
    base_id: 2,
    hours_remaining: 20,
    timestamp: 2019 - 03 - 10,
    archived: false
}

После написания нескольких запросов я не смог достичь своей цели. Это одна из моих попыток.

{
  "size": 10, 
   "query":{
     "bool":{
       "must":[
         {
           "query_string":{
             "query": "*",
             "fields":["name.keyword"]
           }
         },
         {
           "term":{
             "archived": false
           }
          }
       ]
     }
   },
   "collapse": {
    "field": "base_id",
    "inner_hits": {
      "name": "most_recent",
      "size": 1,
      "sort": [{"updatedDate": "desc"}]
    }
  }
}

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 27 февраля 2020

Это проще. Запрос в архиве, независимо от чего-либо еще. затем упорядочите по дате des c и оставьте только первое (размер = 1)

{
  "size": 1,
  "query": {
    "bool": {
      "must": {
        "term": {
          "archived": "false"
        }
      }
    }
  },
  "sort": [
    {
      "updatedDate": {
        "order": "desc"
      }
    }
  ]
}
0 голосов
/ 26 февраля 2020

Я верю, что твоего query_string можно избежать. Если вы хотите получить только archived: false, имя не обязательно.

Я думаю, вы должны сначала использовать условие must, чтобы отфильтровать те, для которых в поле архива установлено значение False, затем вы следует использовать агрегирование терминов в поле name, чтобы оно возвращало вам уникальные имена, которые удовлетворяют условию must.

Затем можно использовать агрегацию max как субагрегация, чтобы принести вам только самое большое значение в поле updatedDate. Окончательный запрос должен выглядеть следующим образом:

"size": 0, #We don't care about the size of this
"query":{
  "bool": {
    "must": {
      "term":{
        "archieved": false #Only false will be shown
      }
    }
  },
}
"aggs":{
  "names":{
    "terms":{
      "field": "name.keyword" #Unique names will be shown here
    },
    "aggs":{
      "most_recent":{
        "max": {
          "field": "updatedDate" #The max value of this field
        }
      }
    }
  }
}

Надеюсь, это полезно! : D

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...