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!="";
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"
}
}
}
}
}
'
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
}
}
}
}
}
}
}
Comme @luqmaan l'a souligné dans les commentaires, la documentation indique 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 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>": ""}}
}
}
}
}
}
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>": ".+"
}
}
}
Vous pouvez utiliser le filtre not en plus de missing .
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"not": {
"filter": {
"missing": {
"field": "searchField"
}
}
}
}
}
}
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.
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": ""
}
}
}
}
]
}
}
}
}
}
Elastic search Get all record where condition not empty.
const searchQuery = {
body: {
query: {
query_string: {
default_field: '*.*',
query: 'feildName: ?*',
},
},
},
index: 'IndexName'
};
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.