Elasticsearch - запрос, чтобы получить последнюю версию записей из плоской структуры - PullRequest
0 голосов
/ 14 октября 2019

У меня есть сценарий, в котором я хотел бы вернуть последние ненормализованные данные из индекса в Elasticsearch, сгруппированного по определенному значению ключа - в сценарии ниже => TradeRef.

Ниже приведена лучшая картина сохраняемых данных в индексе:

{"Row": "1", "TradeRef": "A", "TradeRefDate": "2019-01-01 13:00", "TradeRefId": "FFF", "MessageId": "XXX", "MessageStatus": "S-Open"}, 
{"Row": "2", "TradeRef": "B", "TradeRefDate": "2019-01-01 13:00", "TradeRefId": "GGG", "MessageId": "YYY", "MessageStatus": "P-Open"},
{"Row": "3", "TradeRef": "C", "TradeRefDate": "2019-01-01 13:00", "TradeRefId": "HHH", "MessageId": "ZZZ", "MessageStatus": "Q-Open"},
{"Row": "4", "TradeRef": "A", "TradeRefDate": "2019-01-01 14:00", "TradeRefId": "III", "MessageId": "AAA", "MessageStatus": "R-Open"},
{"Row": "5", "TradeRef": "B", "TradeRefDate": "2019-01-01 14:00", "TradeRefId": "JJJ", "MessageId": "BBB", "MessageStatus": "T-Open"},
{"Row": "6", "TradeRef": "A", "TradeRefDate": "2019-01-01 14:00", "TradeRefId": "III", "MessageId": "CCC", "MessageStatus": "R-Open"},
{"Row": "7", "TradeRef": "B", "TradeRefDate": "2019-01-01 14:00", "TradeRefId": "JJJ", "MessageId": "DDD", "MessageStatus": "T-Open"}

Я хочу, чтобы мой запрос возвратил следующие результаты, где строки 1 и 2 исключены, поскольку они ссылаются на торговые ссылки 'A & B с более ранней датой TradeRefDate (2019-01-01 13:00).

Более свежие строки в индексе содержат тот же TradeRef 'A' и 'B' с более поздней TradeRefDate (2019-01-01 14:00):

{"Row": "3", "TradeRef": "C", "TradeRefDate": "2019-01-01 13:00", "TradeRefId": "HHH", "MessageId": "ZZZ", "MessageStatus": "Q-Open"},
{"Row": "4", "TradeRef": "A", "TradeRefDate": "2019-01-01 14:00", "TradeRefId": "III", "MessageId": "AAA", "MessageStatus": "R-Open"},
{"Row": "5", "TradeRef": "B", "TradeRefDate": "2019-01-01 14:00", "TradeRefId": "JJJ", "MessageId": "BBB", "MessageStatus": "T-Open"},
{"Row": "6", "TradeRef": "A", "TradeRefDate": "2019-01-01 14:00", "TradeRefId": "III", "MessageId": "CCC", "MessageStatus": "R-Open"},
{"Row": "7", "TradeRef": "B", "TradeRefDate": "2019-01-01 14:00", "TradeRefId": "JJJ", "MessageId": "DDD", "MessageStatus": "T-Open"}

Любая помощьбудет оценено. Я пробовал приведенный ниже запрос, но он просто дает мне одну строку на TradeRef вместо соответствующих записей, связанных с последним значением TradeRef:

GET /flattened_index_v1/_search
{
  "from": 0,
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "TradeRefDate": {
              "gte": "2018-09-01T00:00:00",
              "lte": "2019-10-26T00:00:00"
            }
          }
        },
        {
          "exists": {
            "field": "MessageId"
          }
        }
      ]
    }
  },
  "size": 0,
  "aggs": {
    "grp_by_trade_ref": {
      "terms": {
        "field": "TradeRef.keyword",
        "size": 1000
      },
      "aggs": {
        "latest_trecs": {
          "top_hits": {
            "size": 1,
            "sort": [
              {
                "TradeRefDate": {
                  "order": "desc"
                }
              }
            ],
            "_source": {"includes": ["TradeRef", "TradeRefId", "MessageId", "MessageStatus", "TradeRefDate"]}
          }
        }
      }
    }
  }
}

1 Ответ

2 голосов
/ 14 октября 2019
  1. Выполнить агрегацию термина по ключевому слову
  2. Выполнить агрегацию термина по датам под ключевым словом. i Выберите топ 1 на основе даты в порядке убывания ii. Возврат top_hits
GET index22/_search
{
  "size": 0,
  "aggs": {
    "TradeRef": {
      "terms": {
        "field": "TradeRef.keyword",
        "size": 10
      },
      "aggs": {
        "RefDate": {
          "terms": {
            "field": "TradeRefDate",
            "order": {
              "_term": "desc"
            },
            "size": 1
          },
          "aggs": {
            "TopDocuments": {
              "top_hits": {
                "size": 10
              }
            }
          }
        }
      }
    }
  }
}

РЕДАКТИРОВАТЬ 1: Вы можете использовать (композитное агрегирование) [https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-composite-aggregation.html]

В композитном агрегации вы можете разбивать на страницы последовательно с помощью after_key, то есть вы можете затем извлечь n записейСледующие n записей, вы не можете перейти со страницы 1 на страницу 3.

GET index22/_search
{
  "size": 0,
  "aggs": {
    "pagination": {
      "composite": {
       "size": 2,  ---> page_size
        "sources": [
          {
            "TradeRef": {
              "terms": {
                "field": "TradeRef.keyword"
              }
            }
          }
        ]
      },
      "aggs": {
        "RefDate": {
          "terms": {
            "field": "TradeRefDate",
            "order": {
              "_term": "desc"
            },
            "size": 1
          },
          "aggs": {
            "TopDocuments": {
              "top_hits": {
                "size": 10
              }
            }
          }
        }
      }
    }
  }
}

Ответ:

"aggregations" : {
    "pagination" : {
      "after_key" : {
        "TradeRef" : "B"    ----> use to fetch next set of records.
      },
      "buckets" : [
        {
          "key" : {
            "TradeRef" : "A"
          },
          "doc_count" : 3,
          "RefDate" : {
            "doc_count_error_upper_bound" : 0,
            "sum_other_doc_count" : 1,
            "buckets" : [
              {
                "key" : 50460000,
                "key_as_string" : "1970-01-01 14:00",
                "doc_count" : 2,
                "TopDocuments" : {
                  "hits" : {
                    "total" : {
                      "value" : 2,
                      "relation" : "eq"
                    },
                    "max_score" : 1.0,
                    "hits" : [
                      {
                        "_index" : "index22",
                        "_type" : "_doc",
                        "_id" : "IkBnyG0BwSpwFwW4UeB7",
                        "_score" : 1.0,
                        "_source" : {
                          "Row" : "4",
                          "TradeRef" : "A",
                          "TradeRefDate" : "2019-01-01 14:00",
                          "TradeRefId" : "III",
                          "MessageId" : "AAA",
                          "MessageStatus" : "R-Open"
                        }
                      },
                      {
                        "_index" : "index22",
                        "_type" : "_doc",
                        "_id" : "JEBnyG0BwSpwFwW4ceBs",
                        "_score" : 1.0,
                        "_source" : {
                          "Row" : "6",
                          "TradeRef" : "A",
                          "TradeRefDate" : "2019-01-01 14:00",
                          "TradeRefId" : "III",
                          "MessageId" : "CCC",
                          "MessageStatus" : "R-Open"
                        }
                      }
                    ]
                  }
                }
              }
            ]
          }
        },
        {
          "key" : {
            "TradeRef" : "B"
          },
          "doc_count" : 3,
          "RefDate" : {
            "doc_count_error_upper_bound" : 0,
            "sum_other_doc_count" : 1,
            "buckets" : [
              {
                "key" : 50460000,
                "key_as_string" : "1970-01-01 14:00",
                "doc_count" : 2,
                "TopDocuments" : {
                  "hits" : {
                    "total" : {
                      "value" : 2,
                      "relation" : "eq"
                    },
                    "max_score" : 1.0,
                    "hits" : [
                      {
                        "_index" : "index22",
                        "_type" : "_doc",
                        "_id" : "I0BnyG0BwSpwFwW4V-DW",
                        "_score" : 1.0,
                        "_source" : {
                          "Row" : "5",
                          "TradeRef" : "B",
                          "TradeRefDate" : "2019-01-01 14:00",
                          "TradeRefId" : "JJJ",
                          "MessageId" : "BBB",
                          "MessageStatus" : "T-Open"
                        }
                      },
                      {
                        "_index" : "index22",
                        "_type" : "_doc",
                        "_id" : "JUBnyG0BwSpwFwW4h-Cq",
                        "_score" : 1.0,
                        "_source" : {
                          "Row" : "7",
                          "TradeRef" : "B",
                          "TradeRefDate" : "2019-01-01 14:00",
                          "TradeRefId" : "JJJ",
                          "MessageId" : "DDD",
                          "MessageStatus" : "T-Open"
                        }
                      }
                    ]
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
...