Дата обновления Elasticsearch во вложенных - PullRequest
0 голосов
/ 14 февраля 2019

Я хочу удалить 15 минут из всех дат в истории, которые имеют возраст менее 15 минут.

Поэтому мне нужно сравнить дату сейчас - 15 минут с датой записи.

Однако, когда я получаю дату, она не может сравнивать ее, потому что она похожа на строку и добавляет «.value», что атрибут не существует.

Ответ об ошибке:

"if(ctx._source.histories[i].creation_date.value"
dynamic getter [java.lang.String, value] not found

Попробуйте другие решения с другими ошибками:

"if(ctx._source.histories[i].creation_date.date"
"if(ctx._source.histories[i].creation_date.getMillis()"
"if(ctx._source.histories[i].creation_date.value.getMillis()"

Запрос на обновление (asticsearch.js):

{
    "query": { "term": { "user_id": "USER_ID" } },
    "script":
    {
        "lang":   "painless",
        "source": "for(int i = ctx._source.histories.length-1; i > 0; --i){ if(ctx._source.histories[i].creation_date.value > params.date) { ctx._source.histories[i].creation_date -= 1000 * 60 * 15; } }",
        "params": { "date": new Date() - 1000 * 60 * 15 }
    }
}

Отображение:

{
  "mappings":
  {
    "_doc":
    {
      "properties":
      {
        "histories":
        {
          "type": "nested",
          "properties":
          {
            "type":          { "type": "text" },
            "key":           { "type": "text" },
            "value":         { "type": "text" },
            "ip":            { "type": "ip" },
            "useragent":     { "type": "text" },
            "creation_date": { "type": "date" }
          }
        }
      }
    }
  }
}

Информационный эластичный поиск:

{
  "name" : "ZZZ",
  "cluster_name" : "YYY",
  "cluster_uuid" : "XXX",
  "version" : {
    "number" : "6.5.2",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "WWW",
    "build_date" : "2018-11-29T23:58:20.891072Z",
    "build_snapshot" : false,
    "lucene_version" : "7.5.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

Образцы данных:

{
  "hits":
  {
    "total": 1,
    "max_score": 4.13468,
    "hits":
    [
      {
        "_index": "myindex",
        "_type": "_doc",
        "_id": "H1dQ4WgBypYasGfnnXXI",
        "_score": 4.13468,
        "_source":
        {
          "infos":
          {
            "firsname": "John",
            "lastname": "Doe",
            "mail": "john.doe@stackoverflow.com"
          },
          "histories":
          [
            {
                    "type":          "auth",
                    "key":           "try",
                    "value":         "fail",
                    "ip":            "127.0.0.1",
                    "useragent":     "iPhoneX",
                    "creation_date": "2019-02-19T16:49:00.396Z"
            },
            {
                    "type":          "auth",
                    "key":           "try",
                    "value":         "fail",
                    "ip":            "127.0.0.1",
                    "useragent":     "iPhoneX",
                    "creation_date": "2019-02-19T16:50:00.396Z"
            }
          ]
        }
      }
    ]
  }
}

1 Ответ

0 голосов
/ 19 февраля 2019

Думаю, у меня есть кое-что, что может вам помочь (протестировано на ES 6.6.0).

{
  "query": {
    "match_all": {}
  },
  "script": {
    "lang": "painless",
    "source": """
    // parse params.data to Instant
    def paramDate = Instant.parse(params.date);

    for(int i = ctx._source.histories.length-1; i > 0; --i) { 
      // parse the creation date to Instant
      def creationDate = Instant.parse(ctx._source.histories[i].creation_date);

      // check time difference between both
      if (ChronoUnit.MINUTES.between(creationDate, paramDate) <= 15) {
        // remove 15 minutes if condition satisfied
        ctx._source.histories[i].creation_date = creationDate.minusSeconds(900).toString(); 
      } 
    }
    """,
    "params": {
      "date": "2019-02-19T16:45:00.000Z"
    }
  }
}

Примечание: я использую тройные кавычки, чтобы сделать запрос более читабельным, но не стесняйтесьвставьте его снова, как считаете нужным, и удалите комментарии.

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