webentwicklung-frage-antwort-db.com.de

Elasticsearch-Curl-Abfrage für nicht null und nicht leer erstellen ("")

Wie kann ich eine Elasticsearch-Curl-Abfrage erstellen, um den Feldwert zu erhalten, der nicht null und nicht leer ist (""),

Hier ist die Mysql-Abfrage:

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

Ein Nullwert und eine leere Zeichenfolge führen dazu, dass kein Wert indiziert wird. In diesem Fall können Sie den exists-Filter verwenden

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

Oder in Kombination mit (zB) einer Volltextsuche im Feld 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

Wickeln Sie einen Fehlenden Filter in den Muss-Bereich eines Bool-Filters ein. Es werden nur Dokumente zurückgegeben, in denen das Feld vorhanden ist. Wenn Sie die Eigenschaft "null_value" auf "true" setzen, werden Werte explizit nicht null.

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

Wie @luqmaan in den Kommentaren hervorgehoben hat, sagt die Dokumentation , dass der Filter existskeine leeren Zeichenfolgen herausfiltert, da diese als Nicht-Nullwerte betrachtet werden.

Wenn Sie also @ DrTechs Antwort hinzufügen, um Null- und leere Zeichenfolgen effektiv herauszufiltern, sollten Sie etwa Folgendes verwenden:

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

Auf Elasticsearch 5.6 muss ich den folgenden Befehl verwenden, um eine leere Zeichenfolge herauszufiltern:

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

Sie können nicht Filter auf nicht vorhanden verwenden.

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

Sie können das mit bool Abfrage und Kombination von must und must_not so machen:

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

Ich habe dies mit Elasticsearch 5.6.5 in Kibana getestet.

2
Luka Lopusina

Wir verwenden Elasticsearch Version 1.6 und ich habe diese Abfrage von einem Kollegen verwendet, um nicht null und nicht leer für ein Feld abzudecken: 

{
  "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

Die einzige Lösung, die in 5.6.5 für mich funktionierte, war die Regex-Antwort von bigstone1998. Ich würde es jedoch vorziehen, aus Gründen der Performance keine Regex-Suche zu verwenden. Ich glaube, der Grund, warum die anderen Lösungen nicht funktionieren, ist, dass ein Standardfeld analysiert wird und daher kein leerer String-Token vorhanden ist, gegen den negiert werden kann. Die Bestehende Abfrage hilft auch nicht, da eine leere Zeichenfolge als nicht null betrachtet wird.

Wenn Sie den Index nicht ändern können, ist der Regex-Ansatz möglicherweise die einzige Option. Wenn Sie jedoch den Index ändern können, lösen Sie das Problem, indem Sie ein Schlüsselwort-Unterfeld hinzufügen.

In den Zuordnungen für den Index:

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

Dann können Sie einfach die Abfrage verwenden:

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

Beachten Sie den .keyword in der Komponente must_not.

0
LaserJesus