Работата с бази данни е много забавна, но понякога може да бъде предизвикателство, особено когато се работи с вече съществуващи данни.
Например, ако искате да промените типа на конкретно поле, може да се наложи да свалите услугата, което може да има сериозни последици, особено в услугите, които обработват големи количества данни.
За щастие можем да използваме мощните функции на Elasticsearch като Reindexing, поглъщане на възли, тръбопроводи и процесори, за да улесним подобни задачи.
Този урок ще ви покаже как да промените тип поле в конкретен индекс на друг, като използвате възли Elasticsearch Ingest. Използването на този подход ще премахне престоя, който засяга услугите, като същевременно успява да изпълни задачите за промяна на типа поле.
Въведение в Ingest Nodes
Поглъщащият възел на Elasticsearch ви позволява да обработвате предварително документи преди тяхното индексиране.
Elasticsearch възел е специфичен екземпляр на Elasticsearch; свързаните възли (повече от един) правят един клъстер.
Можете да видите възлите, налични в изпълняващия се клъстер със заявката:
ВЗЕМЕТЕ / _nodes /Командата cURL за това е:
curl -XGET “http: // localhost: 9200 / _nodes /”Изпълнението на тази команда трябва да ви даде масивна информация за възлите, както е показано по-долу (пресечен изход):
"_nodes":
"общо": 3,
"успешно": 3,
"неуспешно": 0
,
"име на клъстер": "22e0bee6ef91461d82d9b0f1b4b13b4a",
"възли":
"gSlMjTKyTemoOX-EO7Em4w":
"name": "instance-0000000003",
"transport_address": "172.28.86.133: 19925 ",
"домакин": "172.28.86.133 ",
"ip": "172.28.86.133 ",
"версия": "7.10.2 ",
"build_flavor": "по подразбиране",
"build_type": "докер",
"build_hash": "747e1cc71def077253878a59143c1f785afa92b9",
"total_indexing_buffer": 214748364,
"роли": [
"данни",
"data_cold",
"data_content",
"data_hot",
"data_warm",
"поглъщам",
"господар",
"отдалечен_кластер_клиент",
„Трансформирам“
],
"атрибути" :
"logic_availability_zone": "зона-0",
"име_на сървър": "екземпляр-0000000003.22e0bee6ef91461d82d9b0f1b4b13b4a ",
"availability_zone": "us-west-1c",
"xpack.инсталиран ":" true ",
"instance_configuration": "aws.данни.highio.i3 ",
"трансформирам.възел ":" вярно ",
"region": "us-west-1"
,
"настройки" :
"s3":
"клиент":
"elastic-internal-22e0be":
"крайна точка": "s3-us-west-1.amazonaws.com "
,
--------------------------------изход съкратен---------------------
По подразбиране всички възли на Elasticsearch позволяват поглъщане и могат да обработват поглъщащи операции. За тежки операции с поглъщане обаче можете да създадете единичен възел, посветен само на поглъщане.
За да се справим с pre_process, преди да индексираме документите, трябва да дефинираме конвейер, който посочва поредицата от препроцесори.
Предпроцесорите са набори от инструкции, увити около тръбопровод и се изпълняват една по една.
По-долу е общият синтаксис на това как да се дефинира конвейер:
"description": "Преобразувай ме",
„процесори“: [
"конвертиране":
"field": "id",
"type": "integer"
]
Свойството description казва какво трябва да постигне тръбопроводът. Следващият параметър са препроцесорите, предадени като списък по реда на тяхното изпълнение.
Създайте конвертиране на тръбопровод
За да създадете конвейер, който ще използваме за конвертиране на тип, използвайте заявката PUT с крайната точка на API на _ingest като:
PUT _ingest / pipeline / convert_pipeline“Description”: “преобразува полето dayOfWeek в дълго от цяло число”,
"процесори": [
"конвертиране":
"field": "dayOfWeek",
"type": "long"
]
За cURL използвайте командата:
curl -XPUT "http: // localhost: 9200 / _ingest / pipeline / convert_pipeline" -H 'Content-Type: application / json' -d '"description": "преобразува полето dayOfWeek в дълго от цяло число", " процесори ": [" convert ": " field ":" dayOfWeek "," type ":" long "] 'Преиндексиране и конвертиране Тип
След като имаме конвейера в поглъщащия възел, всичко, което трябва да направим, е да извикаме API за индексиране и да предадем конвейера като аргумент в дестинацията на тялото на заявката като:
POST _reindex„Източник“:
"index": "kibana_sample_data_flights"
,
"dest":
"индекс": "kibana_sample_type_diff",
"pipeline": "convert_pipeline"
За curL:
curl -XPOST "http: // localhost: 9200 / _reindex" -H 'Content-Type: application / json' -d '"source": "index": "kibana_sample_data_flights", "dest": "index ":" kibana_sample_type_diff "," pipeline ":" convert_pipeline " 'Проверете конверсията
За да проверите дали конвейерът е приложен правилно, използвайте заявката GET, за да извлечете това конкретно поле като:
ВЗЕМЕТЕ / kibana_sample_data_flights / _mapping / field / dayOfWeekGET / kibana_sample_type_diff / _mapping / field / dayOfWeek
Това трябва да върне данните като:
-----------------------ОРИГИНАЛЕН ИНДЕКС---------------------------"kibana_sample_data_flights":
"mappings":
"ден на седмицата" :
"full_name": "dayOfWeek",
"mapping":
"ден на седмицата" :
"type": "integer"
-------------------------ПРЕИНДЕКСИРАНИ ДАННИ-------------------------------
"kibana_sample_type_diff":
"mappings":
"ден на седмицата" :
"full_name": "dayOfWeek",
"mapping":
"ден на седмицата" :
"type": "long"
Заключение
В това ръководство разгледахме как да работим с възлите на Elasticsearch Ingest за предварителна обработка на документи преди индексиране, като по този начин преобразуваме поле от един тип в друг.
Разгледайте документацията, за да научите повече.
https: // www.еластична.co / guide / en / elasticsearch / reference / master / ingest.html