La recherche élastique ne parvient pas à effectuer une requête de plage d'horodatage
j'ai besoin de faire une requête dans une certaine plage de temps,
Tout d'abord, je veux faire une requête comme
{
"query": {
"bool": {
"must": [
{
"query_string": {
"query": "13000020"
}
},
{
"range": {
"timestampstring": {
"lte": "2020-10-05 15:22:58.537"
}
}
}
]
}
}
}
et les résultats ont été
{
"took": 15,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 12,
"relation": "eq"
},
"max_score": 2.0,
"hits": [
{
"_index": "test",
"_type": "test12",
"_id": "WvNJl3UBy18_Kc9Pl1tu",
"_score": 2.0,
"_source": {
"hdrId": 13000020,
"timestampstring": "2020-11-05 15:22:58.537",
"DevieId": "624232489",
"type": "data"
}
},
{
"_index": "test",
"_type": "test12",
"_id": "jvOSmHUBy18_Kc9PK3qp",
"_score": 2.0,
"_source": {
"hdrId": 13000020,
"timestamp": 1604582511655,
"timestampstring": "2020-11-05 21:21:51.655",
"type": "data"
}
}
]
}
}
Quelqu'un peut-il identifier la partie que j'ai mal faite?
deuxièmement, je ne parviens pas à faire l'exemple dans ce https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-daterange-aggregation.html
comment l'exemple ci-dessus peut-il convenir à mon application, merci
Jeff
En ce moment, j'essaye de faire dans Postman, voici la configuration
GET http: // myip: 9200 / test / dev / _search et dois-je faire l'index ici?
{
"mappings": {
"properties": {
"timestampstring": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss.SSS"
}
}
}
}
et ça vient
{
"error": {
"root_cause": [
{
"type": "parsing_exception",
"reason": "Unknown key for a START_OBJECT in [mappings].",
"line": 2,
"col": 15
}
],
"type": "parsing_exception",
"reason": "Unknown key for a START_OBJECT in [mappings].",
"line": 2,
"col": 15
},
"status": 400
}
Réponses
Vous n'avez peut-être pas défini le mappage d'index pourtimestampstring
. Pour en savoir plus sur les formats de date, reportez-vous à ceci
Ajout d'un exemple fonctionnel avec des données d'index, un mappage, une requête de recherche et un résultat de recherche
Mappage d'index:
{
"mappings": {
"properties": {
"timestampstring": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss.SSS"
}
}
}
}
Données d'index:
{
"hdrId": 13000020,
"timestamp": 1604582511655,
"timestampstring": "2020-11-05 21:21:51.655",
"type": "data"
}
{
"hdrId": 13000020,
"timestampstring": "2020-11-05 15:22:58.537",
"DevieId": "624232489",
"type": "data"
}
Requête de recherche:
En exécutant maintenant la même requête de recherche, vous obtiendrez le résultat souhaité
{
"query": {
"bool": {
"must": [
{
"query_string": {
"query": "13000020"
}
},
{
"range": {
"timestampstring": {
"lte": "2020-10-05 15:22:58.537"
}
}
}
]
}
}
}
Résultat de la recherche:
"hits": []
Vous pouvez appliquer l' agrégation de plage de dates de la manière suivante:
{
"aggs": {
"range": {
"date_range": {
"field": "timestampstring",
"format": "yyyy-MM-dd HH:mm:ss.SSS",
"ranges": [
{
"to": "now-1M"
},
{
"from": "now-1M"
}
]
}
}
}
}
La requête ci-dessus créera deux segments de plage, le premier "regroupera" tous les documents datés avant il y a un mois, et le second "regroupera" tous les documents datés depuis il y a un mois. Comme dans les données d'index, il n'y a pas de document daté avant 1 mois, donc le doc_count
du premier compartiment est 0 et celui du deuxième compartiment est 2
Résultat de la recherche:
"aggregations": {
"range": {
"buckets": [
{
"key": "*-2020-10-25 10:10:07.665",
"to": 1.603620607665E12,
"to_as_string": "2020-10-25 10:10:07.665",
"doc_count": 0
},
{
"key": "2020-10-25 10:10:07.665-*",
"from": 1.603620607665E12,
"from_as_string": "2020-10-25 10:10:07.665",
"doc_count": 2
}
]
}
}