1
votes

Requête élastique pour rechercher un terme et avec dans une plage de dates

GET _search
{
  "query": {
    "bool":{
      "filter":{
        "and":[
        {
          "term":{
            "Server": "XYZ"
          },
          "range": {
            "DateTime":{
              "from": "2018-12-13T00:20:48.782Z",
              "to":"2018-12-14T00:20:48.782Z"
            }
          }
        }
      ]
    }}
  }
} 
Above is my elastic query to fetch all records belongs to XYZ Server and within the time range, I have Server and DateTime columns in my dataset but throws below error:
  {   "error": {
      "root_cause": [
        {
          "type": "parsing_exception",
          "reason": "[term] malformed query, expected [END_OBJECT] but found [FIELD_NAME]",
          "line": 9,
          "col": 11
        }
      ],
      "type": "parsing_exception",
      "reason": "[term] malformed query, expected [END_OBJECT] but found [FIELD_NAME]",
      "line": 9,
      "col": 11   },   "status": 400 }
What am i missing here!

2 commentaires

Pouvez-vous ajouter les détails de votre mappage d'index?


Vous pouvez utiliser lte et gte pour filtrer la requête de plage de dates. exemple


3 Réponses :


1
votes

Votre requête est mal formée, utilisez plutôt la requête suivante:

GET _search
{
 "query": {
   "bool": {
     "filter": [ 
      {
        "term": { 
          "Server": "XYZ"
        }
      },
      { 
        "range": {
          "DateTime":{
            "from": "2018-12-13T00:20:48.782Z",
            "to": "2018-12-14T00:20:48.782Z"
          }
        }
      }
    ]
  }
 }
}


0 commentaires

0
votes

Vous ne pouvez pas avoir et dans votre clause de filtre. Il n'y a pas de clause et dans la requête ES. Fondamentalement, vous devez combiner le filtre sur la clause term et range . Veuillez lire combiner les filtres dans ES pour en savoir plus informations à ce sujet.

Comme votre requête utilise une clause invalide, ES ne peut pas analyser votre requête.

Veuillez utiliser la requête appropriée et vous devriez pouvoir obtenir les résultats d'ES.

Veuillez essayer la requête ci-dessous, qui devrait fonctionner correctement et faites-moi savoir si cela ne fonctionne pas.

{
  "query": {
    "constant_score": {
      "filter": {
        "bool": {
          "must": [
            {
              "term": {
                "Server": "XYZ"
              }
            },
            {
              "bool": {
                "must": [
                  {
                    "range": {
                      "DateTime": {
                        "from": "2018-12-13T00:20:48.782Z",
                        "to": "2018-12-14T00:20:48.782Z"
                      }
                    }
                  }
                ]
              }
            }
          ]
        }
      }
    }
  }
}


1 commentaires

Si vous êtes dans un contexte de filtre , devez-vous ajouter également une requête de type constant_score ?



0
votes

Le message d'erreur indique clairement que la requête n'est pas correcte.

Vous pouvez consulter la documentation officielle pour range query et pour requête booléenne pour vérifier qu'il n'y a pas de filtre dans les requêtes booléennes et qu'il n'y a pas de requêtes de, à dans la plage.

Veuillez vérifier cette requête.

GET _search
{
 "query": {
   "bool": {
     "must": [ 
      {
        "term": { 
          "Server": "XYZ"
        }
      },
      { 
        "range": {
          "DateTime":{
            "gt": "2018-12-13T00:20:48.782Z",
            "lte": "2018-12-14T00:20:48.782Z"
          }
        }
      }
    ]
  }
 }
}


0 commentaires