Как получить идентификаторы последнего и первого документа по заданным критериям - PullRequest
0 голосов
/ 26 мая 2020

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

{"id":"1","isMigrated":true}
{"id":"2","isMigrated":true}
{"id":"3","isMigrated":false}
{"id":"4","isMigrated":false}

как я могу получить в одном запросе последний перенесенный идентификатор и первый не перенесенный идентификатор? Есть идеи?

Ответы [ 2 ]

1 голос
/ 26 мая 2020

Агрегация фильтров и агрегация top_hits может использоваться для получения последнего перенесенного и первого не перенесенного

{
  "size": 0, 
  "aggs": {
    "migrated": {
      "filter": {              --> filter where isMigrated:true
        "term": {
          "isMigrated": true
        }
      },
      "aggs": {
        "last_migrated": {   --> get first documents sorted on id in descending order
          "top_hits": {
            "size": 1,
            "sort": [{"id.keyword":"desc"}]
          }
        }
      }
    },
    "not_migrated": {
      "filter": {
        "term": {
          "isMigrated": false
        }
      },
      "aggs": {
        "first_not_migrated": {
          "top_hits": {
            "size": 1,
            "sort": [{"id.keyword":"asc"}] -->any keyword field can be used to sort
          }
        }
      }
    }
  }
}

Результат:

 "aggregations" : {
    "not_migrated" : {
      "doc_count" : 2,
      "first_not_migrated" : {
        "hits" : {
          "total" : {
            "value" : 2,
            "relation" : "eq"
          },
          "max_score" : null,
          "hits" : [
            {
              "_index" : "index86",
              "_type" : "_doc",
              "_id" : "TxuKUHIB8mx5yKbJ_rGH",
              "_score" : null,
              "_source" : {
                "id" : "3",
                "isMigrated" : false
              },
              "sort" : [
                "3"
              ]
            }
          ]
        }
      }
    },
    "migrated" : {
      "doc_count" : 2,
      "last_migrated" : {
        "hits" : {
          "total" : {
            "value" : 2,
            "relation" : "eq"
          },
          "max_score" : null,
          "hits" : [
            {
              "_index" : "index86",
              "_type" : "_doc",
              "_id" : "ThuKUHIB8mx5yKbJ87HF",
              "_score" : null,
              "_source" : {
                "id" : "2",
                "isMigrated" : true
              },
              "sort" : [
                "2"
              ]
            }
          ]
        }
      }
    }
  }
0 голосов
/ 26 мая 2020

Вы можете сохранить информацию о метке времени с каждым документом и запросом на основе последней метки времени и условия isMigrated: true.

Согласно комментарию, https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html можно использовать для объединения нескольких логические условия.

...