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!="";
elasticsearch
Uttam Palkar
quelle
quelle
Antworten:
Ein Nullwert und eine leere Zeichenfolge führen dazu, dass kein Wert indiziert wird. In diesem Fall können Sie den
exists
Filter verwendenOder in Kombination mit (zB) einer Volltextsuche auf dem
title
Feld:quelle
exists
Filter in einemand
Filter elasticsearch.org/guide/reference/query-dsl/and-filter.htmlAn empty string is a non-null value.
- elastic.co/guide/en/elasticsearch/reference/current/…Wickeln Sie einen fehlenden Filter in den Abschnitt "Muss nicht" 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, sind Werte explizit nicht null.
quelle
Wie @luqmaan in den Kommentaren hervorhob, heißt es in der Dokumentation , dass der Filter
exists
keine leeren Zeichenfolgen herausfiltert, da diese als Nicht-Null-Werte betrachtet werden .Wenn Sie also zur Antwort von @ DrTech hinzufügen, um null und leere Zeichenfolgenwerte effektiv herauszufiltern, sollten Sie Folgendes verwenden:
quelle
In elasticsearch 5.6 muss ich den folgenden Befehl verwenden, um leere Zeichenfolgen herauszufiltern:
quelle
Sie können dies mit einer Bool-Abfrage und einer Kombination aus must und must_not wie folgt tun:
Ich habe dies mit Elasticsearch 5.6.5 in Kibana getestet.
quelle
Sie können nicht über fehlende Filter filtern .
quelle
Die einzige Lösung, die in 5.6.5 für mich funktioniert hat, war die Regex-Antwort von bigstone1998. Ich würde es jedoch aus Leistungsgründen vorziehen, 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 leeres String-Token zum Negieren vorhanden ist. Die vorhandene Abfrage allein hilft auch nicht weiter, da eine leere Zeichenfolge als nicht null betrachtet wird.
Wenn Sie den Index nicht ändern können, ist der Regex-Ansatz möglicherweise Ihre einzige Option. Wenn Sie jedoch den Index ändern können, wird das Problem durch Hinzufügen eines Schlüsselwort-Unterfelds behoben.
In den Zuordnungen für den Index:
Dann können Sie einfach die Abfrage verwenden:
Beachten Sie die
.keyword
Komponente must_not.quelle
type=text
Felder. Kann aber durch Erweitern des ES-Schemas behoben werden"myfield": { "type": "text", fielddata: true, "fields": { "keyword": { "type": "keyword" } } }
.keyword
? Hat es etwas mit dem analysierten Feld zu tun, damust_not
es genau übereinstimmt? Wenn ja, wenn wir nicht verwenden,.keyword
was bedeutet das? Übrigens, mit.keyword
Arbeiten für mich.Wir verwenden Elasticsearch Version 1.6 und ich habe diese Abfrage eines Kollegen verwendet, um nicht null und nicht leer für ein Feld abzudecken:
quelle
Hier ist das Abfragebeispiel, um das Vorhandensein mehrerer Felder zu überprüfen:
quelle
quelle
Sie können eine Bool-Kombinationsabfrage mit must / must_not verwenden, die eine hervorragende Leistung bietet und alle Datensätze zurückgibt, bei denen das Feld nicht null und nicht leer ist.
bool must_not ist wie "NOT AND", was Feld bedeutet! = "", bool muss existieren, bedeutet its! = null.
so effektiv aktivieren: wobei field1! = null und field1! = ""
ElasticSearch Version:
quelle
Sie müssen die Bool-Abfrage mit must / must_not verwenden und sind vorhanden
Um herauszufinden, wo der Ort null ist
Um dorthin zu gelangen, ist der Ort nicht null
quelle