2 votes

Comment faire une requête get pour récupérer le dernier document d'un index dans le cluster elasticsearch ?

Je développe une application node.js pour obtenir la dernière valeur d'un index à partir d'un cluster élastique. Mon serveur logstash envoie des données à elasticsearch toutes les secondes. Ainsi, l'index elasticsearch est mis à jour toutes les secondes. Chaque seconde, un nouveau document est ajouté à l'index elasticsearch.

Voici un exemple de document JSON

{
  "_index": "weather",
  "_type": "doc",
  "_id": "eMIs_mQBol0Vk4cfUzG5",
  "_version": 1,
  "_score": null,
  "_source": {
    "weather": {
      "main": "Clouds",
      "icon": "04n",
      "description": "broken clouds",
      "id": 803
    },
    "@version": "1",
    "clouds": {
      "all": 75
    },
    "main": {
      "humidity": 36,
      "pressure": 1022,
      "temp": 41,
      "temp_max": 26,
      "temp_min": 26
    },
    "wind": {
      "deg": 360,
      "speed": 3.6
    },
    "visibility": 16093,
    "@timestamp": "2018-08-03T05:04:35.134Z",
    "name": "Santa Clara"
  },
  "fields": {
    "@timestamp": [
      "2018-08-03T05:04:35.134Z"
    ]
  },
  "sort": [
    1533272675134
  ]
}

Voici la photo de la table,

enter image description here Mon code node.js ressemble à ceci,

let express = require('express');
let app = express();
let elasticsearch = require('elasticsearch');

app.get('/', function(req, res) {
    res.send('Hello World!');
});
app.listen(3000, function() {
    console.log('Example app listening on port 3000!');
});

let client = new elasticsearch.Client({
    host: ['http://localhost:9200']
});

client.ping({
    requestTimeout: 30000,
}, function(error) {
    if (error) {
        console.error('elasticsearch cluster is down!');
    } else {
        console.log('Everything is ok');
    }
});

async function getResponse() {
    const response = await client.get({
        index: 'weather',
        type: 'doc',
        id: 'KsHW_GQBol0Vk4cfl2WY'
    });
    console.log(response);
}

getResponse();

Je suis capable de récupérer le document JSON basé sur l'id de l'index. Mais, je veux récupérer le dernier document JSON. Comment puis-je configurer mon serveur pour qu'il lise le dernier document toutes les secondes ? Existe-t-il un moyen de récupérer le dernier document JSON (sans connaître l'identifiant à l'avance) ?

Quelqu'un peut-il m'aider ? J'apprécierais vraiment que vous puissiez m'aider.

Merci d'avance !

2voto

TechnocratSid Points 937

Si vous avez un horodatage dans votre index et qui est mis à jour/ajouté après l'indexation de chaque document. Vous pouvez alors simplement effectuer un trier sur le champ de l'horodatage avec taille=1 .

La requête ci-dessous vous donnera la valeur la plus récente :

{
  "query": {
    "match_all": {}
  },
  "size": 1,
  "sort": [
    {
      "timestamp": {
        "order": "desc"
      }
    }
  ]
}

Je ne suis pas sûr de la syntaxe de node.js mais quelque chose comme ça devrait fonctionner :

client.search({
  index: 'weather',
  type: 'doc'
  body: {
    sort: [{ "timestamp": { "order": "desc" } }],
    size: 1,
    query: { match_all: {}}
 }
});

D'après votre cartographie, vous avez @timestamp donc vous devriez utiliser :

client.search({
  index: 'weather',
  type: 'doc'
  body: {
    sort: [{ "@timestamp": { "order": "desc" } }],
    size: 1,
    query: { match_all: {}}
 }
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X