94 votes

Créer une requête curl Elasticsearch pour not null et not empty("")

Comment puis-je créer une requête curl Elasticsearch pour obtenir la valeur des champs qui ne sont pas nuls et non vides (""),

Voici la requête mysql :

select field1 from mytable where field1!=null and field1!="";

90voto

DrTech Points 7453

Une valeur nulle et une chaîne vide ont toutes deux pour conséquence qu'aucune valeur n'est indexée, auquel cas vous pouvez utiliser la fonction exists filtre

curl -XGET 'http://127.0.0.1:9200/test/test/_search?pretty=1'  -d '
{
   "query" : {
      "constant_score" : {
         "filter" : {
            "exists" : {
               "field" : "myfield"
            }
         }
      }
   }
}
'

Ou en combinaison avec (par exemple) une recherche en texte intégral sur le site Web de la Commission européenne. title champ :

curl -XGET 'http://127.0.0.1:9200/test/test/_search?pretty=1'  -d '
{
   "query" : {
      "filtered" : {
         "filter" : {
            "exists" : {
               "field" : "myfield"
            }
         },
         "query" : {
            "match" : {
               "title" : "search keywords"
            }
         }
      }
   }
}
'

39voto

cavpollo Points 1918

Comme l'a fait remarquer @luqmaan dans les commentaires, la documentation dit que le filtre exists ne filtre pas les chaînes vides car elles sont considérées comme des valeurs non nulles. .

Pour compléter la réponse de @DrTech, afin de filtrer efficacement les valeurs de type chaîne vide et nulle, vous devez utiliser quelque chose comme ceci :

{
    "query" : {
        "constant_score" : {
            "filter" : {
                "bool": {
                    "must": {"exists": {"field": "<your_field_name_here>"}},
                    "must_not": {"term": {"<your_field_name_here>": ""}}
                }
            }
        }
    }
}

34voto

bigstone1998 Points 476

Sur elasticsearch 5.6, je dois utiliser la commande ci-dessous pour filtrer les chaînes vides :

    GET /_search
    {
        "query" : {
            "regexp":{
                "<your_field_name_here>": ".+"
            }
        }
    }

32voto

Zach Points 4033

Enveloppez un Filtre manquant dans la section "Must-Not" d'un Filtre Bool . Elle ne renvoie que les documents dans lesquels le champ existe et, si vous attribuez la valeur true à la propriété "null_value", les valeurs qui ne sont pas explicitement nulles.

{
  "query":{
     "filtered":{
        "query":{
           "match_all":{}
        },
        "filter":{
            "bool":{
              "must":{},
              "should":{},
              "must_not":{
                 "missing":{
                    "field":"field1",
                    "existence":true,
                    "null_value":true
                 }
              }
           }
        }
     }
  }
}

9voto

Luka Lopusina Points 1156

Vous pouvez le faire avec une requête bool et une combinaison de must et must_not comme ceci :

GET index/_search
{
    "query": {
        "bool": {
            "must": [
                {"exists": {"field": "field1"}}
            ],
            "must_not": [
                {"term": {"field1": ""}}
            ]
        }
    }
}

J'ai testé cela avec Elasticsearch 5.6.5 dans Kibana.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X