asticsearch переиндексирует элемент вложенного объекта в ключевое слово - PullRequest
0 голосов
/ 24 ноября 2018

У меня есть индекс, структурированный как показано ниже:

"my_index": {
  "mappings": {
    "my_index": {
      "properties": {
        "adId": {
          "type": "keyword"
        },
        "name": {
          "type": "keyword"
        },
        "title": {
          "type": "keyword"
        },
        "creativeStatistics": {
          "type": "nested",
          "properties": {
            "clicks": {
              "type": "long"
            },
            "creativeId": {
              "type": "keyword"
            }
          }
        }
      }
    }
  }
}

Мне нужно удалить вложенный объект в новом индексе и просто сохранить creativeId как новое ключевое слово (чтобы было понятно: я знаю, что будупотерять данные clicks, и это не важно).Это означает, что окончательная новая схема индекса будет выглядеть следующим образом:

"my_new_index": {
  "mappings": {
    "my_new_index": {
      "properties": {
        "adId": {
          "type": "keyword"
        },
        "name": {
          "type": "keyword"
        },
        "title": {
          "type": "keyword"
        },
        "creativeId": {
          "type": "keyword"
        }
      }
    }
  }
}

В настоящее время каждая строка имеет ровно одну creativeStatistics. и, следовательно, нет необходимости выбирать один из creativeId s.

Я знаю, что можно переиндексировать, используя painless сценарии, но я не знаю, как я могу это сделать.Любая помощь будет оценена.

Ответы [ 2 ]

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

Вы также можете создать конвейер , создав обработчик сценариев следующим образом:

PUT _ingest/pipeline/my_pipeline
{
  "description" : "My pipeline",
  "processors" : [
    { "script" : {
        "source": "for (item in ctx.creativeStatistics) { if(item.creativeId!=null) {ctx.creativeId = item.creativeId;} }"
      }  
    },
    {
      "remove": {
        "field": "creativeStatistics"
      }
    }
  ]
}

Обратите внимание, что если у вас есть несколько вложенных объектов, он добавитпоследний объект creativeId.И он добавил бы creativeId, только если исходный документ содержит его в creativeStatistics.

Ниже описано, как можно использовать запрос переиндексации:

POST _reindex
{
  "source": {
    "index": "creativeindex_src"
  },
  "dest": {
    "index": "creativeindex_dest",
    "pipeline": "my_pipeline"
  }
}
0 голосов
/ 24 ноября 2018

Вы можете сделать это так:

POST _reindex
{
  "source": {
    "index": "my_old_index"
  },
  "dest": {
    "index": "my_new_index"
  },
  "script": {
    "source": "if (ctx._source.creativeStatistics != null && ctx._source.creativeStatistics.size() > 0) {ctx._source.creativeId = ctx._source.creativeStatistics[0].creativeId; ctx._source.remove('creativeStatistics')}",
    "lang": "painless"
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...