web-dev-qa-db-fra.com

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

Comment puis-je créer une requête curl Elasticsearch pour obtenir la valeur du champ qui ne sont ni nulles ni vides

Voici la requête mysql:

select field1 from mytable where field1!=null and field1!="";
52
uttam palkar

Une valeur null et une chaîne vide ne donnent lieu à l'indexation d'aucune valeur, auquel cas vous pouvez utiliser le filtre exists

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 champ title:

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"
            }
         }
      }
   }
}
'
59
DrTech

Wrap a Filtre manquant dans la section Must-Not d'un Bool Filter . Il renverra uniquement les documents contenant le champ et, si vous définissez la propriété "null_value" sur true, les valeurs explicitement non null.

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

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

Donc, en ajoutant à la réponse de @ DrTech, pour filtrer efficacement les valeurs de chaîne nulles et vides, vous devriez utiliser quelque chose comme ceci:

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

Sur elasticsearch 5.6, je dois utiliser la commande ci-dessous pour filtrer la chaîne vide:

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

Vous pouvez utiliser le filtre not en plus de missing .

"query": {
  "filtered": {
     "query": {
        "match_all": {}
     },
     "filter": {
        "not": {
           "filter": {
              "missing": {
                 "field": "searchField"
              }
           }
        }
     }
  }
}
5
Sanshila

Vous pouvez le faire avec une requête booléenne 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 à Kibana.

2
Luka Lopusina

Nous utilisons Elasticsearch version 1.6 et j'ai utilisé cette requête d'un collègue pour couvrir non nul et non vide pour un champ: 

{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "bool": {
          "must": [
            {
              "exists": {
                "field": "myfieldName"
              }
            },
            {
              "not": {
                "filter": {
                  "term": {
                    "myfieldName": ""
                  }
                }
              }
            }
          ]
        }
      }
    }
  }
}
1
James Drinkard
Elastic search Get all record where condition not empty.

const searchQuery = {
      body: {
        query: {
          query_string: {
            default_field: '*.*',
            query: 'feildName: ?*',
          },
        },
      },
      index: 'IndexName'
    };
0
Ashfaq Hussain

La seule solution qui a fonctionné pour moi en 5.6.5 a été la réponse rationnelle de bigstone1998. Je préférerais cependant ne pas utiliser une recherche par expression régulière pour des raisons de performances. Je crois que la raison pour laquelle les autres solutions ne fonctionnent pas, c'est parce qu'un champ standard sera analysé et, par conséquent, ne contiendra aucun jeton de chaîne vide. La requête exist ne sera d'aucun secours, car une chaîne vide est considérée comme non nulle.

Si vous ne pouvez pas modifier l'index, l'approche regex peut être votre seule option, mais si vous pouvez modifier l'index, l'ajout d'un sous-champ de mot-clé résoudra le problème.

Dans les mappages pour l'index:

"myfield": {
    "type": "text",
    "fields": {
        "keyword": {
            "ignore_above": 256,
            "type": "keyword"
        }
    }
}

Ensuite, vous pouvez simplement utiliser la requête:

{
  "query": {
    "bool": {
      "must": {
        "exists": {
          "field": "myfield"
        }
      },
      "must_not": {
        "term": {
          "myfield.keyword": ""
        }
      }
    }
  }
}

Notez le .keyword dans le composant must_not.

0
LaserJesus