webentwicklung-frage-antwort-db.com.de

Gibt den neuesten Datensatz aus dem ElasticSearch-Index zurück

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?

41
Yasir

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"
      }
    }
  ]
}
53
mconlin

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"
        }
      }
    }
  }
}
9

Sie können sort am Datumsfeld und size = 1 parameter ..__ verwenden. Hilft es?

5
dadoonet

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
      ]
    }]
  }
}
3
Jayaram Venkat

Wenn Sie Python Elasticsearch5-Modul oder Curl verwenden:

  1. stellen Sie sicher, dass jedes Dokument, das eingefügt wird, über .__ verfügt.
    • ein Zeitstempelfeld vom Typ datetime
    • und Sie erhöhen den Zeitstempelwert für jedes Dokument monoton
  2. 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.

1

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
            ]
         }
      ]
   }
}
0
SergeyB

Ich benutzte @timestamp anstatt _timestamp

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

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.

0
Bamboomy