La recherche élastique ne parvient pas à effectuer une requête de plage d'horodatage

Nov 25 2020

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

2 ESCoder Nov 25 2020 at 10:00

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_countdu 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
        }
      ]
    }
  }