Ich möchte den neuesten Datensatz (Top 1) aus dem ElasticSearch-Index ähnlich der unten stehenden SQL-Abfrage zurückgeben.
SELECT TOP 1 Id, name, title
FROM MyTable
ORDER BY Date DESC;
Kann das gemacht werden?
Haben Sie _timestamp in Ihrem Doc-Mapping aktiviert?
{
"doctype": {
"_timestamp": {
"enabled": "true",
"store": "yes"
},
"properties": {
...
}
}
}
Sie können Ihre Zuordnung hier überprüfen:
http://localhost:9200/_all/_mapping
Wenn ja, denke ich, könnte dies funktionieren, um das Neueste zu erhalten:
{
"query": {
"match_all": {}
},
"size": 1,
"sort": [
{
"_timestamp": {
"order": "desc"
}
}
]
}
Aus Informationsgründen ist _timestamp nun seit 2.0.0-beta2 ..__ veraltet. Verwenden Sie date
in Ihrem Mapping.
Ein einfaches Datumszuordnungs-JSON aus date
datatype doc:
{
"mappings": {
"my_type": {
"properties": {
"date": {
"type": "date"
}
}
}
}
}
Sie können auch ein format
-Feld in date
hinzufügen:
{
"mappings": {
"my_type": {
"properties": {
"date": {
"type": "date",
"format": "yyy-MM-dd HH:mm:ss||yyyy-MM-dd||Epoch_millis"
}
}
}
}
}
Letzte ID mit Datum (ohne Zeitstempel) verwenden
Beispiel-URL: http: // localhost: 9200/deal/dealdetails/
Methode: POST
Abfrage:
{
"fields": ["_id"],
"sort": [{
"created_date": {
"order": "desc"
}
},
{
"_score": {
"order": "desc"
}
}
],
"size": 1
}
ergebnis:
{
"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
]
}]
}
}
Wenn Sie Python Elasticsearch5-Modul oder Curl verwenden:
von Python aus
es = elasticsearch5.Elasticsearch('my_Host:my_port')
es.search(
index='my_index',
size=1,
sort='my_timestamp:desc'
)
Wenn Ihre Dokumente nicht mit einem Feld vom Typ datetime eingefügt werden, glaube ich nicht, dass Sie das N "neueste" erhalten können.
Seitdem diese Frage ursprünglich gestellt und beantwortet wurde, haben sich einige Funktionen von Elasticsearch geändert, insbesondere in Bezug auf Zeitstempel. Hier ist ein vollständiges Beispiel, das zeigt, wie nach einem einzelnen neuesten Datensatz abgefragt wird. Getestet auf ES 6/7.
1) Weisen Sie Elasticsearch an, das Feld timestamp
als Zeitstempel zu behandeln
curl -XPUT "localhost:9200/my_index?pretty" -H 'Content-Type: application/json' -d '{"mappings":{"message":{"properties":{"timestamp":{"type":"date"}}}}}'
2) Fügen Sie einige Testdaten in den Index ein
curl -XPOST "localhost:9200/my_index/message/1" -H 'Content-Type: application/json' -d '{ "timestamp" : "2019-08-02T03:00:00Z", "message" : "hello world" }'
curl -XPOST "localhost:9200/my_index/message/2" -H 'Content-Type: application/json' -d '{ "timestamp" : "2019-08-02T04:00:00Z", "message" : "bye world" }'
3) Abfrage des neuesten Datensatzes
curl -X POST "localhost:9200/my_index/_search" -H 'Content-Type: application/json' -d '{"query": {"match_all": {}},"size": 1,"sort": [{"timestamp": {"order": "desc"}}]}'
4) Erwartete Ergebnisse
{
"took":0,
"timed_out":false,
"_shards":{
"total":5,
"successful":5,
"skipped":0,
"failed":0
},
"hits":{
"total":2,
"max_score":null,
"hits":[
{
"_index":"my_index",
"_type":"message",
"_id":"2",
"_score":null,
"_source":{
"timestamp":"2019-08-02T04:00:00Z",
"message":"bye world"
},
"sort":[
1564718400000
]
}
]
}
}
Ich benutzte @timestamp
anstatt _timestamp
{
'size' : 1,
'query': {
'match_all' : {}
},
"sort" : [{"@timestamp":{"order": "desc"}}]
}
der Zeitstempel hat für mich nicht geklappt,
diese Abfrage funktioniert für mich:
(wie in mconlins Antwort)
{
"query": {
"match_all": {}
},
"size": "1",
"sort": [
{
"@timestamp": {
"order": "desc"
}
}
]
}
Könnte trivial sein, aber die _timestamp Antwort gab keinen Fehler aus, aber auch kein gutes Ergebnis ...
Hoffe, jemandem zu helfen ...
(kibana/elastisch 5.0.4)
S.