Newbie question on ElasticSearch:
I have following data with http://localhost:9200/tutorial/_doc/7:
"_index":"tutorial","_type":"_doc","_id":"7","_version":3,"_seq_no":25,"_primary_term":2,"found":true,
"_source":{
"message": "error",
"@timestamp": "2022-05-16T09:40:00"
}
and I'm trying to find all records with @timestamp between 2022-05-16T09:30:00 and 2022-05-16T09:50:00 with following request:
POST http://localhost:9200/tutorial/_search
Content-Type: application/json
{
"query": {
"bool": {
"filter": {
"bool": {
"must": [
{
"range": {
"@timestamp.keyword": {
"gt": "2022-05-16T09:30:00",
"lte": "2022-05-16T09:50:00"
}
}
}
]
}
}
}
}
}
The question I have, is that why do I have to use @timestamp.keyword but not just @timestamp for the value under range? If I use the one without keyword, I'll get nothing back.
A bit context, I'm setting up Elastalert which requires a @timestamp field. I checked that the requests it sends to ElasticSearch put @timestamp as the range without keyword, therefore it's not giving me any value.
Result for http://localhost:9200/tutorial if it helps:
{
"tutorial":{
"aliases":{
},
"mappings":{
"properties":{
"@timestamp":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
},
"fielddata":true
},
"message":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
}
}
},
"settings":{
"index":{
"routing":{
"allocation":{
"include":{
"_tier_preference":"data_content"
}
}
},
"number_of_shards":"1",
"provided_name":"tutorial",
"creation_date":"1652405360958",
"number_of_replicas":"1",
"uuid":"OuynpaOiRyqQ1sj-b2xuYw",
"version":{
"created":"7170399"
}
}
}
}
}
Your
@timestampfield is not mapped correctly, astext/keywordfield types are not appropriate for date values. You need to change your mapping to this instead:Then you'll be able to run your
rangequery on@timestamp