15 KiB
"snapshots" : [ { "snapshot" : "snapshot_201403190415", "indices" : [...], "state" : "SUCCESS", "start_time" : "2014-03-19T03:15:03.380Z", "start_time_in_millis" : 1395198903380, "end_time" : "2014-03-19T03:16:33.381Z", "end_time_in_millis" : 1395198993381, "duration_in_millis" : 90001, ... "snapshot" : "snapshot_201403201222", "indices" : [...], "state" : "SUCCESS", "start_time" : "2014-03-20T11:22:07.441Z", "start_time_in_millis" : 1395314527441, "end_time" : "2014-03-20T11:22:56.176Z", "end_time_in_millis" : 1395314576176, "duration_in_millis" : 48735, "failures" : [ ], "shards" : { "total" : 86, "failed" : 0, "successful" : 86
Pour supprimer un snapshot :
$ curl -s -XDELETE "localhost:9200/_snapshot/foo/snapshot_test"
### Sauvegarde via snapshots
On peut ainsi créer régulièrement des snapshots pour les sauvegardes.
Pour créer un snapshot toutes les heures, et en conserver 24 en permanence (notion de snapshots "roulants") :
~~~{.bash}
$ date=$(date +%H)
$ curl -s -X DELETE "127.0.0.1:9200/_snapshot/foo/h${date}" | grep -v acknowledged..true
$ curl -s -X PUT "127.0.0.1:9200/_snapshot/foo/h${date}?wait_for_completion=true" -o /tmp/es_snapshot_h${date}.log
Plus classiquement pour avoir un snapshot par jour :
$ date=$(date +%Y-%m-%d)
$ curl -s -XDELETE "localhost:9200/_snapshot/foo/snapshot_${date}" | grep -v acknowledged..true
$ curl -s -XPUT "localhost:9200/_snapshot/foo/snapshot_${date}?wait_for_completion=true" -o /tmp/es_snapshot_${date}.log
On peut ensuite purger les snapshots vieux de plus de 10 jours ainsi :
$ cd /home/backup-elasticsearch/foo
$ for i in $(ls -1d snapshot-* | head -n -10 | sed s'/snapshot-snapshot_//g'); do curl -s -XDELETE "localhost:9200/_snapshot/foo/snaps
hot_${i}"; done
Principe de fonctionnement
Basé sur le livre http://exploringelasticsearch.com/book
On utilisera l'outil cURL pour faire les requêtes.
En plaçant à la fin d'une URI ?pretty=true
on pourra obtenir un JSON formaté, plus lisible pour les humains.
Avec une base de données d'exemple
Nous allons utiliser une base de données d'exemple pour faire des tests.
Télécharger, https://github.com/andrewvc/ee-datasets/archive/master.zip, décompresser l'archive et exécuter le programme Java qui va injecter la BDD "movie_db" dans votre cluster ES.
$ java -jar elastic-loader.jar http://localhost:9200 datasets/movie_db.eloader
La BDD movie_db contient quelques noms de films, avec leurs informations associés (genre, date, acteurs, …).
Pour consulter tout son contenu :
$ curl http://localhost:9200/movie_db/_search?pretty=true
En créant une base de données
Opérations CRUD
Créer un index (équivalent d'une base de données) nommé planet :
$ curl -X PUT localhost:9200/planet
Créer un type de donnée nommé « hacker » :
$ curl -X PUT localhost:9200/planet/hacker/_mapping -d '
{
"hacker": {
"properties": {
"handle": {
"type": "string"
},
"age": {
"type": "long"
}
}
}
}
'
Créer un document de type hacker avec l'ID 1 :
$ curl -X PUT localhost:9200/planet/hacker/1 -d '{"handle": "jean-michel", "age": 18}'
Voir son contenu :
$ curl localhost:9200/planet/hacker/1?pretty=true
Mise à jour du champ âge :
$ curl -X POST localhost:9200/planet/hacker/1/_update -d '{"doc": {"age": 19}}'
Suppression du document :
$ curl -X DELETE localhost:9200/planet/hacker/1
Recherche basique
Recréons un index de test :
$ curl -X DELETE localhost:9200/planet
$ curl -X PUT localhost:9200/planet -d '
{
"mappings": {
"hacker": {
"properties": {
"handle": {
"type": "string"
},
"hobbies": {
"type": "string",
"analyzer": "snowball"
}
}
}
}
}
'
Ajoutons quelques documents :
$ curl -X PUT localhost:9200/planet/hacker/1 -d '
{
"handle": "mark",
"hobbies": ["rollerblading", "hacking", "coding"]
}
'
$ curl -X PUT localhost:9200/planet/hacker/2 -d '
{
"handle": "gondry",
"hobbies": ["writing", "skateboarding"]
}
'
$ curl -X PUT localhost:9200/planet/hacker/3 -d '
{
"handle": "jean-michel",
"hobbies": ["coding", "rollerblades"]
}
'
Recherchons ceux qui ont pour hobby rollerblading :
$ curl -X POST localhost:9200/planet/hacker/_search?pretty=true -d '
{
"query": {
"match": {
"hobbies": "rollerblading"
}
}
}
'
On obtiens 2 résultats, jean-michel et mark. Pourtant le hobby de jean-michel n'est pas rollerblading mais rollerblades, alors comment Elastic Search l'a trouvé ? C'est parce qu’il comprend que rollerblading et rollerblades sont très similaires ! Cela grâce à l'analyseur de type « snowball » que nous avons indiqué lors de la création du type hobbies. Cela indique à ES qu'il s'agit non pas d'une chaîne de caractère banale mais du texte Anglais (Gestion des autres langues ?).
FAQ
Erreur "failed to map segment from shared object: Operation not permitted"
Si vous obtenez une erreur du type :
[2016-06-15 14:53:05,714][WARN ][bootstrap ] unable to load JNA native support library, native methods will be disabled.
java.lang.UnsatisfiedLinkError: /tmp/jna--1985354563/jna3461912487982682933.tmp: /tmp/jna--1985354563/jna3461912487982682933.tmp: failed
to map segment from shared object: Operation not permitted
C'est peut-être que vous avez votre partition /tmp
en noexec, il faut alors changer le chemin comme indiqué sur #configuration-de-base