Pourquoi les requêtes construites par Kibana dans discover n'utilisent-elles pas la requête must?

Bonjour,

Je développe une application web pour visualiser des données dans un elastic et je m'inspire des requêtes faites par Kibana dans l'application Discover en allant inspecter l'objet requête créé dans l'onglet Inspect de Discover.

J'ai l'impression qu'en dehors des termes négatifs qui utilisent : "bool":{"must_not" :[]} pour créer la requête, la requête must[] (qui n'est de toute façon pas la même chose que must_not[]) n'est jamais utilisée et à la place, Kibana utilise une imbrication de requête filter[] et de requête should[].

Y a-t-il une raison particulière de ne pas utiliser la requête must[], surtout si la requête ne contient que des opérateurs "ET" ?

De plus, les requêtes contenant que des opérateurs "ET" ont exactement la même structure d'imbrication de should[] que les requêtes contenant que des opérateurs "OU". Du coup comment Kibana fait pour séparer "je veux ça et ça et ça" de "je veux ça ou ça ou ça".

Dans mon interpréteur de requête précédent j'avais un objet should[] qui contenait plusieurs objet must[]. Chaque objet must[] permettait de stocker les opérateurs "ET" côte à côte, et à chaque fois qu'il y avait un opérateur "OU" je créé donc un nouvel objet must[] dans l'objet should[] principal.

Maintenant que je veux utiliser la même structure que les requêtes faites par l'application Discover de Kibana, je vois que l'objet parent et un filter[] suivi d'une imbrication de should[], comment peut on alors séparer un "ET" d'un "OU" ?

Exemple de query créé par Kibana récupéré dans l'onglet Inspect de l'application Discover pour la requête suivante:

field1:"match_field1" AND field2:"match_field2" AND field3:"match_field3" AND field4:"match_field4" AND field5:"match_field5"
Cela donne la requête:

"query": {
    "bool": {
      "must": [],
      "filter": [
        {
          "bool": {
            "filter": [
              {
                "bool": {
                  "should": [
                    {
                      "match_phrase": {
                        "field1": "match_field1"
                      }
                    }
                  ],
                  "minimum_should_match": 1
                }
              },
              {
                "bool": {
                  "filter": [
                    {
                      "bool": {
                        "should": [
                          {
                            "match_phrase": {
                              "field2": "match_field2"
                            }
                          }
                        ],
                        "minimum_should_match": 1
                      }
                    },
                    {
                      "bool": {
                        "filter": [
                          {
                            "bool": {
                              "should": [
                                {
                                  "match_phrase": {
                                    "field3": "match_field3"
                                  }
                                }
                              ],
                              "minimum_should_match": 1
                            }
                          },
                          {
                            "bool": {
                              "filter": [
                                {
                                  "bool": {
                                    "should": [
                                      {
                                        "match_phrase": {
                                          "field4": "match_field4"
                                        }
                                      }
                                    ],
                                    "minimum_should_match": 1
                                  }
                                },
                                {
                                  "bool": {
                                    "should": [
                                      {
                                        "match_phrase": {
                                          "field5": "match_field5"
                                        }
                                      }
                                    ],
                                    "minimum_should_match": 1
                                  }
                                }
                              ]
                            }
                          }
                        ]
                      }
                    }
                  ]
                }
              }
            ]
          }
        },
        {
          "range": {
            "@timestamp": {
              "gte": "2021-05-04T15:14:08.772Z",
              "lte": "2022-08-04T15:14:08.772Z",
              "format": "strict_date_optional_time"
            }
          }
        }
      ],
      "should": [],
      "must_not": []
    }
  },

Merci d'avance si vous prenez le temps de m'aider.

La requête peut-être énormément simplifiée.

Ça utilise en fait ici un filter qui plus rapide qu'un must.

Les clauses should sont en dessous et individualisées par terme.

1 Like

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.