Come cambio il tipo di campo in Elasticsearch?

Come cambio il tipo di campo in Elasticsearch?
Utilizzando l'API _ mapping, è possibile aggiornare i campi esistenti o aggiungere nuovi campi a un indice esistente.

NOTA: Per eseguire le modifiche a un indice, assicurati di avere i privilegi di gestione sull'indice di destinazione.

Uso di base

Per modificare un tipo di campo, inviare una richiesta put all'API _mapping seguito dall'organismo di richiesta. Il corpo di richiesta include il parametro delle proprietà e la mappatura del campo target. Quando si crea un nuovo campo, assicurarsi di includere i parametri del nome, del tipo e della mappatura del campo.

Ad esempio, la seguente richiesta modifica il tipo di campo dal numero intero a lungo.

Put /my-index /_mapping

"proprietà":
"prezzo base":
"Tipo": "Long"


Al completamento con successo, dovresti vedere un output come:


"riconosciuto": vero

Metodo di reindicizzazione

Nella maggior parte dei casi, Elasticsearch ti impedirà di aggiornare il tipo di campo di un indice esistente. In questo modo potrebbe portare a non essere validi i dati attuali e causare errori nell'indice.

Se vuoi ancora aggiornare il tipo di campo esistente, puoi farlo in alcuni semplici passaggi.

  1. Crea un nuovo indice con le informazioni di mappatura corrette in cui il tipo di campo viene modificato nel tipo desiderato.
  2. Rifornire i dati dal vecchio indice al nuovo indice.
  3. Rimuovi il vecchio indice

L'uso di questo metodo consente di ridurre i tempi di inattività minimi per l'indice.

Creazione di un vecchio indice

Iniziamo creando un indice con il tipo di campo errato.

Put /Change-me

"Mappings":
"proprietà":
"id":
"tipo": "intero"
,
"Nome utente":
"tipo": "testo"



Nell'esempio sopra, abbiamo un semplice indice con i due campi: ID e nome utente. I tipi di campo sono rispettivamente interi e testo.

Supponiamo che il campo contenga i dati come mostrato nella seguente query:

Post /Change-me /_doc


"id": 1000,
"Nome utente": "Root"

Post /Change-me /_doc

"id": 1001,
"Nome utente": "Altro"

Le due query sopra creeranno un documento con i dati forniti nell'organismo di richiesta.

Assicurarsi che i dati esistano:

Get /cambia-me /_search?bello

"query":
"Match_all":

Dovremmo vedere i due record come mostrato:

Crea un nuovo indice

Diciamo che vogliamo cambiare il campo ID da un numero intero a una parola chiave. Inizieremo creando un nuovo indice con il tipo come parole chiave.

Put /Change-Me-Reindex

"Mappings":
"proprietà":
"id":
"Digita": "Parola chiave"
,
"Nome utente":
"tipo": "testo"



Nella richiesta sopra, creiamo un nuovo indice e impostiamo il tipo di ID su una parola chiave.

Rifornire i vecchi dati

Il prossimo passo è riporre i dati dal vecchio indice a quello nuovo utilizzando l'API _ reindex. La richiesta per ciò è sotto:

Post /_Reindex

"fonte":
"INDICE": "Cambia-me"
,
"dest":
"INDICE": "Change-Me-Reindex"

La richiesta di cui sopra copierà i documenti dal vecchio indice a quello nuovo in cui il tipo di campo cambia da un numero intero a una parola chiave.

Output dalla query sopra:


"preso": 8,
"timed_out": false,
"Totale": 4,
"Aggiornato": 0,
"Creato": 4,
"Eliminato": 0,
"Batches": 1,
"versione_conflitti": 0,
"Noops": 0,
"Rittani":
"Bulk": 0,
"Cerca": 0
,
"throttled_millis": 0,
"Richiedi_per_second": -1.0,
"throttled_until_millis": 0,
"Failure": []

Elimina il vecchio indice

Ora che abbiamo un indice aggiornato con la mappatura corretta, è tempo di rimuovere il vecchio indice. Possiamo farlo inviando una richiesta di eliminazione all'indice come:

Elimina /cambio-me

Dopo aver trasmesso una riuscita rimozione, dovresti vedere un output come:


"riconosciuto": vero

Crea alias indice

Se avessi applicazioni utilizzando il vecchio indice, potrebbero smettere di funzionare poiché non esiste più.

Possiamo risolverlo creando un alias per il nuovo indice con il nome del vecchio indice.

Put/Change-Me-Reindex/_alias/Change-me

La richiesta di cui sopra dovrebbe creare un alias per il nuovo indice.

Conclusione

In questa guida, hai scoperto come cambiare il tipo di campo esistente in un indice di Elasticsearch.