web-dev-qa-db-fra.com

Renvoie l'enregistrement le plus récent de l'index ElasticSearch

Je voudrais renvoyer l’enregistrement le plus récent (top 1) de l’index ElasticSearch similaire à la requête SQL ci-dessous;

SELECT TOP 1 Id, name, title 
FROM MyTable 
ORDER BY Date DESC;

Cela peut-il être fait?

41
Yasir

Avez-vous _timestamp activé dans votre mapping de doc?

{
    "doctype": {
        "_timestamp": {
            "enabled": "true",
            "store": "yes"
        },
        "properties": {
            ...
        }
    }
}

Vous pouvez vérifier votre cartographie ici: 

http://localhost:9200/_all/_mapping

Si tel est le cas, je pense que cela pourrait fonctionner pour obtenir le plus récent:

{
  "query": {
    "match_all": {}
  },
  "size": 1,
  "sort": [
    {
      "_timestamp": {
        "order": "desc"
      }
    }
  ]
}
53
mconlin

Pour information, _timestamp est maintenant déconseillé depuis la version 2.0.0-beta2 . Utilisez date dans votre correspondance.

Un simple mappage de date JSON de date datatype doc:

{
  "mappings": {
     "my_type": {
        "properties": {
          "date": {
          "type": "date" 
        }
      }
    }
  }
}

Vous pouvez également ajouter un champ format dans date:

{
  "mappings": {
    "my_type": {
      "properties": {
        "date": {
          "type":   "date",
          "format": "yyy-MM-dd HH:mm:ss||yyyy-MM-dd||Epoch_millis"
        }
      }
    }
  }
}
9
Adrien Chaussende

Vous pouvez utiliser sort le champ de date et taille = 1 paramètre .

5
dadoonet

Obtenir le dernier identifiant en utilisant la date (avec l'horodatage) 

Exemple d'URL: http: // localhost: 9200/deal/dealsdetails/
Méthode: POST

Requête:

{
  "fields": ["_id"],
  "sort": [{
      "created_date": {
        "order": "desc"
      }
    },
    {
      "_score": {
        "order": "desc"
      }
    }
  ],
  "size": 1
}

résultat:

{
  "took": 4,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 9,
    "max_score": null,
    "hits": [{
      "_index": "deal",
      "_type": "dealsdetails",
      "_id": "10",
      "_score": 1,
      "sort": [
        1478266145174,
        1
      ]
    }]
  }
}
3
Jayaram Venkat

Si vous utilisez le module python elasticsearch5 ou curl:

  1. assurez-vous que chaque document inséré a
    • un champ d'horodatage de type datetime
    • et vous augmentez de manière monotone la valeur d'horodatage de chaque document
  2. de python vous faites 

    es = elasticsearch5.Elasticsearch('my_Host:my_port')
    es.search(
        index='my_index', 
        size=1,
        sort='my_timestamp:desc'
        )
    

Si vos documents ne sont insérés avec aucun champ de type datetime, alors je ne pense pas que vous puissiez obtenir le N "le plus récent".

1
Trevor Boyd Smith

l'horodatage n'a pas fonctionné pour moi,

cette requête fonctionne pour moi:

(comme dans la réponse de mconlin)

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

Cela pourrait être trivial mais la réponse de _timestamp n’a pas donné une erreur, mais pas un bon résultat non plus ...

J'espère aider quelqu'un ...

(kibana/élastique 5.0.4)

S.

0
Bamboomy