web-dev-qa-db-fra.com

Pouvons-nous récupérer les documents _source précédents avec les versions de recherche élastique

J'ai lu le blog sur ES concernant versioning .

Cependant, j'aimerais pouvoir obtenir les précédents documents "_souce" à partir d'une mise à jour.

Par exemple, disons que j'ai cet objet:

{
    "name": "John",
    "age": 32,
    "job": "janitorial technician"
}
// this becomes version 1

Et je le mets à jour:

{
    "name": "John",
    "age": 32,
    "job": "president"
}
// this becomes version 2

Ensuite, grâce au contrôle de version dans ES, pourrais-je obtenir la propriété "job" précédente de l'objet? J'ai essayé ça:

curl -XGET "localhost:9200/index/type/id?version=1"

mais cela ne fait que renvoyer l'objet _source le plus à jour (celui dont John est président).

J'aimerais en fait implémenter un aspect de différences de version un peu comme StackOverflow. (BTW, j'utilise la recherche élastique comme base de données principale - s'il existe un moyen de le faire avec d'autres bases de données nosql, je serais heureux de l'essayer. De préférence, une qui s'intègre bien avec ES.)

49
swatkins

Non, vous ne pouvez pas le faire en utilisant le versioning intégré. Tout ce que cela fait est de stocker le numéro de version actuel pour vous empêcher d'appliquer des mises à jour hors service.

Si vous souhaitez conserver plusieurs versions disponibles, vous devez l'implémenter vous-même. Selon le nombre de versions que vous souhaitez probablement stocker, vous pouvez adopter trois approches:

Pour les changements de faible volume:

1) stocker les anciennes versions dans le même document

{ text: "foo bar",
  date:  "2011-11-01",
  previous: [
      { date: '2011-10-01', content: { text: 'Foo Bar' }},
      { date: '2011-09-01', content: { text: 'Foo-bar!' }},
  ]
}

Pour les changements de volume élevés:

2) ajoutez un indicateur current:

{
   doc_id:  123,
   version: 3,
   text:    "foo bar",
   date:    "2011-11-01",
   current: true
}

{
   doc_id:  123,
   version: 2,
   text:    "Foo Bar",
   date:    "2011-10-01",
   current: false
}

3) Identique à (2) ci-dessus, mais stockez les anciennes versions dans un index séparé, gardant ainsi votre index "live", qui sera utilisé pour la majorité de vos requêtes, petit et plus performant.

65
DrTech