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!="";
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"
}
}
}
}
}
'
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
}
}
}
}
}
}
}
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>": ""}}
}
}
}
}
}
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 pas filtre sur le dessus de manquant .
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"not": {
"filter": {
"missing": {
"field": "searchField"
}
}
}
}
}
}
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": ""
}
}
}
}
]
}
}
}
}
}
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.
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" },