Refresh vs flush

Si un nouveau document est indexé sur l’index Elasticsearch, il est disponible pour rechercher quelque chose comme 1 seconde après l’opération d’index. Cependant, il peut être forcé de rendre ce document consultable immédiatement en appelant l’opération _flush ou _refresh sur l’index. Quelle est la différence entre ces deux opérations – le résultat semble être le même pour eux, le document est immédiatement consultable.

Que fait exactement chacune de ces opérations?

La documentation ES ne semble pas aborder ce problème en profondeur.

La réponse que vous avez obtenue est correcte, mais je pense que cela vaut la peine d’élaborer un peu plus.

Une actualisation appelle effectivement une réouverture sur le lecteur d’index lucene, de sorte que l’instantané ponctuel des données que vous pouvez rechercher soit mis à jour. Cette fonctionnalité de lucene fait partie de l’api proche du temps réel lucene.

Un rafraîchissement d’elasticsearch rend vos documents disponibles pour la recherche, mais il ne s’assure pas qu’ils sont écrits sur un disque dur, car il n’appelle pas fsync, ce qui ne garantit pas la durabilité. Ce qui rend vos données durables, c’est un commit lucene, ce qui est bien plus cher.

Bien que vous puissiez appeler lucene rouvrir toutes les secondes, vous ne pouvez pas faire la même chose avec lucene commit.

Grâce à lucene, vous pouvez disposer de nouveaux documents pour la recherche en temps quasi réel en appelant assez souvent la réouverture, mais vous devez toujours appeler commit pour vous assurer que les données sont écrites sur le disque et synchronisées, donc sûres.

Elasticsearch résout ce “problème” en ajoutant un journal de transactions par partition (en fait un index lucene), où les opérations d’écriture qui n’ont pas encore été validées sont stockées. Le journal des transactions est sécurisé et sécurisé, vous obtenez ainsi une durabilité à tout moment, même pour les documents qui n’ont pas encore été validés. Vous pouvez effectuer une recherche sur des documents en temps quasi-réel lorsque l’actualisation se produit automatiquement toutes les secondes, et vous pouvez également être sûr que si quelque chose ne va pas, le journal des transactions peut être relu pour restaurer les documents éventuellement perdus. La bonne chose à propos du journal des transactions est qu’il peut être utilisé en interne pour d’autres choses, par exemple pour fournir une identification par identifiant en temps réel.

Un vidage elasticsearch déclenche effectivement une validation lucene et vide également le journal des transactions, car une fois que les données sont validées au niveau lucene, la durabilité peut être garantie par lucene lui-même. Flush est également présenté comme un api et peut être modifié, bien que cela ne soit généralement pas nécessaire. Flush se produit automatiquement en fonction du nombre d’opérations ajoutées au journal des transactions, de leur taille et de la dernière vidage.

Une actualisation entraîne l’écriture d’un nouveau segment, qui devient donc disponible pour la recherche.

Un flush provoque un Lucene s’engager à se produire. C’est beaucoup plus cher.

Pour plus de détails, j’ai écrit un article qui couvre une partie de ceci: Elasticsearch de bas en haut 🙂