Elasticsearch: получать документы только при изменении значения - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть индекс ES с такими документами:

from_1,to_1,timestamp_1
from_1,to_1,timestamp_2
from_1,to_2,timestamp_3
from_2,to_3,timestamp_4
from_1,to_2,timestamp_5
from_2,to_3,timestamp_6
from_1,to_1,timestamp_7
from_2,to_4,timestamp_8

Мне нужен запрос, который вернул бы документ, только если его комбинация значений from и to отличается от предыдущего просмотренного документа с тем же значением from.

То есть с приведенным выше образцом:

  1. документ с timestamp_1 должен быть в результате, потому что нет более раннего документа с from_1 + to_1 комбинацией
  2. документ с timestamp_2 должен быть пропущен, поскольку его комбинация from + to точно такая же, как последний просмотренный документ с from = from_1
  3. документ с timestamp_3 должен быть в результате, потому что его поле to (to_2) отличается от значения последнего, замеченного с тем же from (to_1 в документе с timestamp_1
  4. документ с timestamp_4 должен быть в результате
  5. документ с timestamp_5 не должен быть в результате, потому что он имеет ту же комбинацию от + до, что и последний, с которым from_1 (документ с timestamp_3)
  6. документ с timestamp_6 не должен быть в результате, потому что он имеет ту же комбинацию от + до, что и последний, который был замечен с from_2 (документ с timestamp_4)
  7. документ с timestamp_7 должен быть в результате, потому что он имеет различную комбинацию от + до последнего увиденного с from_1 (документ с timestamp_3)
  8. документ с timestamp_8 должен быть в результате, потому что его комбинация совершенно новая

Мне нужно извлечь все такие «полууникальные» документы из индекса, поэтому было бы неплохо, если бы можно было использовать запрос scroll или after_key, если используется агрегация.

Есть идеи как подойти?

1 Ответ

0 голосов
/ 20 ноября 2018

Самое близкое, что я могу придумать, это следующее (дайте мне знать, если оно не работает с вашими данными).

{
  "size": 0,
  "aggs": {
    "from_and_to": {
      "composite" : {
        "size": 5,
        "sources": [
          {
            "from_to_collected":{
              "terms": {
                "script": {
                  "lang": "painless",
                  "source": "doc['from'].value + '_' + doc['to'].value"
                }
              }
            }
          }]
      },
      "aggs": {
        "top_from_and_to_hits": {
          "top_hits": {
            "size": 1,
            "sort": [{"timestamp":{"order":"asc"}}],
            "_source": {"includes": ["_id"]}
          }
        }
      }
    }
  }
}

Имейте в виду, что агрегации terms вероятностный .

Это позволит вам перейти к следующему набору сегментов по клавише from_to_collected.

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