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!="";
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"
}
}
}
}
}
'
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
}
}
}
}
}
}
}
Wie @luqmaan in den Kommentaren hervorgehoben hat, sagt die Dokumentation , dass der Filter exists
keine 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>": ""}}
}
}
}
}
}
Auf Elasticsearch 5.6 muss ich den folgenden Befehl verwenden, um eine leere Zeichenfolge herauszufiltern:
GET /_search
{
"query" : {
"regexp":{
"<your_field_name_here>": ".+"
}
}
}
Sie können nicht Filter auf nicht vorhanden verwenden.
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"not": {
"filter": {
"missing": {
"field": "searchField"
}
}
}
}
}
}
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.
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": ""
}
}
}
}
]
}
}
}
}
}
Elastic search Get all record where condition not empty.
const searchQuery = {
body: {
query: {
query_string: {
default_field: '*.*',
query: 'feildName: ?*',
},
},
},
index: 'IndexName'
};
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.