Как вставить скриптовое поле с помощью конвейера переноса - PullRequest
1 голос
/ 11 марта 2020

Итак, у меня есть два поля в моих документах

{
    emails: ["", "", ""]
    name: "",
 }

И я хочу иметь новое поле после индексации документов, называемое uid, которое будет просто содержать объединенные строки всех писем и имя для с каждым делом c.

Я могу получить поле со сценарием, подобное этому, используя этот запрос GET для моего индекса _search конечная точка

{
 "script_fields": {
"combined": {
    "script": {
      "lang": "painless",
      "source": "def result=''; for (String email: doc['emails.keyword']) { result = result + email;} return doc['name'].value + result;"
    }
}
  }
 }

Я хочу знать, что мой PUT конвейера PUT Тело запроса должно выглядеть так, если я хочу, чтобы такое же поле скриптов индексировалось в моих документах?

1 Ответ

2 голосов
/ 11 марта 2020

Допустим, у меня есть приведенный ниже образец индекса и образец документа.

Пример исходного индекса

Ради понимания я создал приведенное ниже отображение.

PUT my_source_index
{
  "mappings": {
    "properties": {
      "email":{
        "type":"text"
      },
      "name":{
        "type": "text"
      }
    }
  }
}

Образец документа:

POST my_source_index/_doc/1
{
  "email": ["john@gmail.com","doe@outlook.com"],
  "name": "johndoe"
}

Просто выполните следующие шаги

Шаг 1: Создайте входящий конвейер

PUT _ingest/pipeline/my-pipeline-concat
{
  "description" : "describe pipeline",
  "processors" : [
    {
      "join": {
        "field": "email",
        "target_field": "temp_uuid",
        "separator": "-"
      }
    },
    {
      "set": {
        "field": "uuid",
        "value": "{{name}}-{{temp_uuid}}"
      }
    },
    {
      "remove":{
        "field": "temp_uuid"
      }
    }
  ]
}

Обратите внимание, что я Я использовал Ingest API , где я использую три процессора , в то время как создает вышеуказанный конвейер , который будет выполняться в последовательности:

Обратите внимание, что я использую - в качестве разделителя между всеми значениями. Вы можете свободно использовать все, что захотите.

Шаг 2. Создание индекса назначения:

PUT my_dest_index
{
  "mappings": {
    "properties": {
      "email":{
        "type":"text"
      },
      "name":{
        "type": "text"
      },
      "uuid":{                  <--- Do not forget to add this
        "type": "text"
      }
    }
  }
}

Шаг 3. Применение Reindex API:

POST _reindex
{
  "source": {
    "index": "my_source_index"
  },
  "dest": {
    "index": "my_dest_index",
    "pipeline": "my-pipeline-concat"       <--- Make sure you add pipeline here
  } 
}

Обратите внимание, как я упомянул конвейер при использовании Reindex API

Шаг 4. Проверка индекса назначения:

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "my_dest_index",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "name" : "johndoe",
          "uuid" : "johndoe-john@gmail.com-doe@outlook.com",   <--- Note this
          "email" : [
            "john@gmail.com",
            "doe@outlook.com"
          ]
        }
      }
    ]
  }
}

Надеюсь, это поможет!

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