Créer une requête Elasticsearch curl pour non null et non vide("")

Comment puis-je créer une requête de type Elasticsearch curl pour obtenir la valeur du champ qui n'est ni nulle ni vide (""),

Voici la requête mysql:

select field1 from mytable where field1!=null and field1!="";
43
demandé sur Kyle Mathews 2013-02-07 10:45:44

8 réponses

une valeur nulle et une chaîne vide font qu'aucune valeur n'est indexée, auquel cas vous pouvez utiliser le 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 (eg) 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"
            }
         }
      }
   }
}
'
56
répondu DrTech 2013-02-07 10:23:47

envelopper un filtre manquant dans la section à ne pas manquer D'un filtre de bobine . Il retournera seulement les documents où le champ existe, et si vous définissez la propriété" null_value " à true, des valeurs qui ne sont pas explicitement null.

{
  "query":{
     "filtered":{
        "query":{
           "match_all":{}
        },
        "filter":{
            "bool":{
              "must":{},
              "should":{},
              "must_not":{
                 "missing":{
                    "field":"field1",
                    "existence":true,
                    "null_value":true
                 }
              }
           }
        }
     }
  }
}
21
répondu Zach 2016-06-28 13:40:32

comme @luqmaan l'a souligné dans les commentaires, la" documentation 151930920 dit que le filtre exists ne 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 null et vider les chaînes de caractères, 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>": ""}}
                }
            }
        }
    }
}
13
répondu cavpollo 2017-06-12 15:04:02

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>": ".+"
            }
        }
    }  
9
répondu bigstone1998 2018-01-22 15:34:31

vous pouvez utiliser pas filtre sur le dessus de manquant .

"query": {
  "filtered": {
     "query": {
        "match_all": {}
     },
     "filter": {
        "not": {
           "filter": {
              "missing": {
                 "field": "searchField"
              }
           }
        }
     }
  }
}
5
répondu Sanshila 2016-02-22 13:05:28

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

{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "bool": {
          "must": [
            {
              "exists": {
                "field": "myfieldName"
              }
            },
            {
              "not": {
                "filter": {
                  "term": {
                    "myfieldName": ""
                  }
                }
              }
            }
          ]
        }
      }
    }
  }
}
1
répondu James Drinkard 2016-02-03 04:12:18

vous pouvez faire cela avec la requête de bool et la combinaison de must et must_not comme ceci:

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

j'ai testé ceci avec Elasticsearch 5.6.5 à Kibana.

1
répondu Luka Lopusina 2018-06-25 09:42:39

vous pouvez utiliser une requête de combinaison bool avec must/must_not qui donne de grandes performances et renvoie tous les enregistrements où le champ n'est pas null et pas vide.

bool must_not est comme "pas et" ce qui signifie champ!="", bool doit exister des moyens de son !=NULL.

donc habilitant efficacement: où field1!= null et field1!= ""

GET  IndexName/IndexType/_search
{
    "query": {
      "bool": {
            "must": [{
                "bool": {
                    "must_not": [{
          "term": { "YourFieldName": ""}
                    }
          ]
                    }           }, {
                "bool": {
                    "must": [{
                      "exists" : { "field" : "YourFieldName" }
                    }
                    ]
                }
            }]
      } 
    }
}

Version ElasticSearch: "version": { "nombre": "5.6.10", "lucene_version": "6.6.1" },

0
répondu Dean Jain 2018-09-07 17:39:45