Mettre à jour / remplacer les données de l'index

Bonjour,

J'ai une entrée sous logstash par commande. La commande est programmée toutes les 5 minutes qui me renvoi des résultats anciens et de nouvelles données (avec des champs dates, user, webservice).
Pour éviter les doublons, je voudrai donc indexer seulement les nouveaux résultats de mon input.

J'ai vu qu'on pouvait paramétrer l'action de l'output par un "update"
https://www.elastic.co/guide/en/logstash/6.2/plugins-outputs-elasticsearch.html#plugins-outputs-elasticsearch-action

    index => "XXX-%{+YYYY-MM-dd}"
				      hosts => ["XXXXXXX"]
				      template_name =>"XXXX"
			     document_id => "log"
					  doc_as_upsert => true
					  action => "update"

Le problème c'est que ça ne marche pas, il n'y a aucunes insertions de documents.

Quelle est la meilleure façon de faire pour éviter d’insérer des doublons à chaque indexation ? Mettre à jour les données ou les remplacer, et comment ?

Merci de l'aide :grinning:

Tu peux utiliser le même _id de document plutôt que de faire un update.
Ainsi les documents seront écrasés.

Autre solution, réindexer tout dans un nouvel index et utiliser un alias pour switcher de l'index A vers l'index B quand c'est fini.

1 Like

Merci pour ta réactivité.

J'ai opté pour la première solution et ça marche, j'ai modifié ma sortie

                        index => "XXX-%{+YYYY-MM-dd}"
			hosts => ["XXXXXXX"]
		        #template_name =>"XXXX"
			document_id => "%{date}"
			doc_as_upsert => true
			#action => "update"

Cependant, quand j'ai 2 lignes avec les même dates, ça m’insère qu'un seul et c'est normal vu que mon document_id compare la date.

Exemple d'entrée:
Fri Jan 24 08:30:21 CET 2020;User12;NEW.XXX.XXXX

Quel _id choisir pour que se soit plus pertinent ?

Tu peux calculer un hash des champs déterminants. Avec ceci: https://www.elastic.co/guide/en/logstash/current/plugins-filters-fingerprint.html

Et utiliser le résultat comme _id.

Je pense que tu peux aussi supprimer cette ligne:

doc_as_upsert => true

Merci @dadoonet pour les explications :+1:

J'ai donc modifié mon fichier .conf

filter {
 ...
			 fingerprint {
					method => 'SHA1'
					key => '00000000'
			}
  }

output {
		elasticsearch {
			 ...
			document_id => "%{fingerprint}"
 }
}

... et ça marche. Je n'ai que les nouvelles données qui s'ajoutent, pas de doublons :grin:

Sache néanmoins que tu reindexes quand même tous les anciens documents.

Donc la meilleure façon de faire est de créer un alias ?

Je ne comprends pas la remarque. Quel rapport avec l'alias?
Tu veux dire qu'il vaut mieux indexer à nouveau dans un index vierge et utiliser un alias pour passer du vieil index au nouveau?

Oui, je pense.