Я хотел бы вернуть самую последнюю запись (вверху 1) из индекса ElasticSearch, похожую на запрос sql ниже:
SELECT TOP 1 Id, name, title
FROM MyTable
ORDER BY Date DESC;
Можно ли это сделать?
Я хотел бы вернуть самую последнюю запись (вверху 1) из индекса ElasticSearch, похожую на запрос sql ниже:
SELECT TOP 1 Id, name, title
FROM MyTable
ORDER BY Date DESC;
Можно ли это сделать?
У вас есть _ timestamp включена в вашем сопоставлении документов?
{
"doctype": {
"_timestamp": {
"enabled": "true",
"store": "yes"
},
"properties": {
...
}
}
}
Здесь вы можете проверить свое сопоставление:
http://localhost:9200/_all/_mapping
Если это так, я думаю, что это может сработать для последнего:
{
"query": {
"match_all": {}
},
"size": 1,
"sort": [
{
"_timestamp": {
"order": "desc"
}
}
]
}
С информационной целью _timestamp теперь устарел с версии 2.0.0-beta2.
Используйте date
введите свое сопоставление.
Простая сопоставление даты JSON из date
datatype doc:
{
"mappings": {
"my_type": {
"properties": {
"date": {
"type": "date"
}
}
}
}
}
Вы также можете добавить поле format
в date
:
{
"mappings": {
"my_type": {
"properties": {
"date": {
"type": "date",
"format": "yyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
}
}
}
}
Вы можете использовать sort в поле даты и параметр size = 1. Это помогает?
Получить последний идентификатор по дате (без отметки времени)
Пример URL: http://localhost:9200/deal/dealsdetails/
Метод: POST
Запрос:
{
"fields": ["_id"],
"sort": [{
"created_date": {
"order": "desc"
}
},
{
"_score": {
"order": "desc"
}
}
],
"size": 1
}
результат:
{
"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
]
}]
}
}
Если вы используете модуль pythonasticsearch5 или curl:
из питона вы делаете
es = elasticsearch5.Elasticsearch('my_host:my_port')
es.search(
index='my_index',
size=1,
sort='my_timestamp:desc'
)
Если ваши документы не вставлены ни в какое поле типа datetime, то я не верю, что вы можете получить N "самый последний".
_timestamp не сработал у меня,
этот запрос работает для меня:
(как в ответе mconlin)
{
"query": {
"match_all": {}
},
"size": "1",
"sort": [
{
"@timestamp": {
"order": "desc"
}
}
]
}
Может быть тривиальным, но ответ _timestamp не дал ошибку, но не был хорошим результатом...
Надеюсь помочь кому-то...
(кибана/эластичность 5.0.4)
S.
Я использовал @timestamp
вместо _timestamp
{
'size' : 1,
'query': {
'match_all' : {}
},
"sort" : [{"@timestamp":{"order": "desc"}}]
}
С тех пор как этот вопрос был первоначально задан и получен ответ, некоторые из внутренних функций Elasticsearch изменились, особенно вокруг временных меток. Вот полный пример, показывающий, как запросить одну последнюю запись. Проверено на ES 6/7.
1) Скажите Elasticsearch, чтобы обрабатывать поле timestamp
как метку времени
curl -XPUT "localhost:9200/my_index?pretty" -H 'Content-Type: application/json' -d '{"mappings":{"message":{"properties":{"timestamp":{"type":"date"}}}}}'
2) Поместите некоторые тестовые данные в индекс
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) Запрос последней записи
curl -X POST "localhost:9200/my_index/_search" -H 'Content-Type: application/json' -d '{"query": {"match_all": {}},"size": 1,"sort": [{"timestamp": {"order": "desc"}}]}'
4) Ожидаемые результаты
{
"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
]
}
]
}
}