Найти ближайшую метку времени - PullRequest
0 голосов
/ 26 октября 2019

Я использую Elasticsearch 6.4.2, и мне нужно найти предыдущие и следующие документы с учетом указанной временной отметки.

Вроде как, если бы я сделал SELECT TOP 1 * from table WHERE date < 2019-01-01 ORDER BY date DESC и SELECT TOP 1 * from table WHERE date > 2019-01-01 ORDER BY date ASC для таблицы SQL, чтобы найти предыдущую и следующую записи за 2019-01-01, вы знаете?

Есть идеи?

Ответы [ 2 ]

1 голос
/ 26 октября 2019

Данные:

[
      {
        "_index" : "index25",
        "_type" : "_doc",
        "_id" : "mceIBm4B1qXGA4PnKzvZ",
        "_score" : 1.0,
        "_source" : {
          "id" : 1,
          "date" : "2019-10-01"
        }
      },
      {
        "_index" : "index25",
        "_type" : "_doc",
        "_id" : "mseIBm4B1qXGA4PnRDvs",
        "_score" : 1.0,
        "_source" : {
          "id" : 2,
          "date" : "2019-10-02"
        }
      },
      {
        "_index" : "index25",
        "_type" : "_doc",
        "_id" : "m8eIBm4B1qXGA4PncDv9",
        "_score" : 1.0,
        "_source" : {
          "id" : 3,
          "date" : "2019-10-03"
        }
      },
      {
        "_index" : "index25",
        "_type" : "_doc",
        "_id" : "nMeIBm4B1qXGA4Pnhjvs",
        "_score" : 1.0,
        "_source" : {
          "id" : 4,
          "date" : "2019-10-04"
        }
      },
      {
        "_index" : "index25",
        "_type" : "_doc",
        "_id" : "nceIBm4B1qXGA4Pnmjtm",
        "_score" : 1.0,
        "_source" : {
          "id" : 5,
          "date" : "2019-10-05"
        }
      }
    ]

Запрос: я использую два фильтра и агрегирования терминов, чтобы получить первую дату больше и меньше 2019-10-03

{
  "size": 0,
  "aggs": {
    "above": {
      "filter": {
        "range": {
          "date": {
            "gt": "2019-10-03"
          }
        }
      },
      "aggs": {
        "TopDocument": {
          "terms": {
            "field": "date",
            "size": 1,
            "order": {
              "_term": "asc"
            }
          },
          "aggs": {
            "documents": {
              "top_hits": {
                "size": 10
              }
            }
          }
        }
      }
    },
    "below":{
      "filter": {
        "range": {
          "date": {
            "lt": "2019-10-03"
          }
        }
      },
      "aggs": {
        "TopDocument": {
          "terms": {
            "field": "date",
            "size": 1,
            "order": {
              "_term": "desc"
            }
          },
          "aggs": {
            "documents": {
              "top_hits": {
                "size": 10
              }
            }
          }
        }
      }
    }
  }
}

Ответ:

{
    "below" : {
      "doc_count" : 2,
      "TopDocument" : {
        "doc_count_error_upper_bound" : 0,
        "sum_other_doc_count" : 1,
        "buckets" : [
          {
            "key" : 1569974400000,
            "key_as_string" : "2019-10-02T00:00:00.000Z",
            "doc_count" : 1,
            "documents" : {
              "hits" : {
                "total" : {
                  "value" : 1,
                  "relation" : "eq"
                },
                "max_score" : 1.0,
                "hits" : [
                  {
                    "_index" : "index25",
                    "_type" : "_doc",
                    "_id" : "mseIBm4B1qXGA4PnRDvs",
                    "_score" : 1.0,
                    "_source" : {
                      "id" : 2,
                      "date" : "2019-10-02"
                    }
                  }
                ]
              }
            }
          }
        ]
      }
    },
    "above" : {
      "doc_count" : 2,
      "TopDocument" : {
        "doc_count_error_upper_bound" : 0,
        "sum_other_doc_count" : 1,
        "buckets" : [
          {
            "key" : 1570147200000,
            "key_as_string" : "2019-10-04T00:00:00.000Z",
            "doc_count" : 1,
            "documents" : {
              "hits" : {
                "total" : {
                  "value" : 1,
                  "relation" : "eq"
                },
                "max_score" : 1.0,
                "hits" : [
                  {
                    "_index" : "index25",
                    "_type" : "_doc",
                    "_id" : "nMeIBm4B1qXGA4Pnhjvs",
                    "_score" : 1.0,
                    "_source" : {
                      "id" : 4,
                      "date" : "2019-10-04"
                    }
                  }
                ]
              }
            }
          }
        ]
      }
    }
  }
0 голосов
/ 26 октября 2019

Вы можете попробовать это:

ВЫБРАТЬ ТОП 1 * из таблицы ГДЕ дата <2019-01-01 ЗАКАЗАТЬ ПО ДАТЕ DESC </strong>

   {
      "sort": [
        {
          "date": {
            "order": "desc"
          }
        }
      ],
      "query": {
        "bool": {
          "filter": [
            {
              "range": {
                "date": {
                  "lt": "2019-01-01"
                }
              }
            }
          ]
        }
      },
      "size": 1
    }

ВЫБРАТЬ ТОП 1 * из таблицы ГДЕ дата> 2019-01-01 ЗАКАЗАТЬ ПО ДАТЕ ASC

   {
      "sort": [
        {
          "date": {
            "order": "asc"
          }
        }
      ],
      "query": {
        "bool": {
          "filter": [
            {
              "range": {
                "date": {
                  "gt": "2019-01-01"
                }
              }
            }
          ]
        }
      },
      "size": 1
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...