2017-10-12 4 views
0

Je cherche un moyen de rechercher le nombre de documents ayant un certain champ binaire "non défini" dans un index mappé. Cependant, la requête standard "Existe" ne semble pas fonctionner. Exemple:Elasticsearch: Existe une requête sur un champ binaire

{ 
 
    "some-index": { 
 
    "mappings": { 
 
     "some-type": { 
 
     "properties": { 
 
      "data": { 
 
      "type": "binary" 
 
      } 
 
     } 
 
     } 
 
    } 
 
    } 
 
}

Requête: POST http://.../some-index/some-type/_search?size=1

{ 
 
    "query":{ 
 
    "exists":{ 
 
     "field":"data" 
 
    } 
 
    } 
 
}

La requête serait au-dessus de retour 0 résultat, peu importe quoi. Je suppose que c'est parce que Elasticsearch ne stocke pas les champs binaires dans la source par défaut, et la requête "Existe" ne regarde que la source.

Existe-t-il une alternative à l'utilisation de la requête Exists, idéalement sans utiliser de champ booléen supplémentaire dans le mappage?

Répondre

1

Est-ce que ce qui suit fait ce que vous voulez ... Je crée un template avec field1 comme type binaire, puis indexe un document avec juste field2 (que je n'ai pas pris la peine de définir) puis je cherche des docs sans field1. Vous pouvez exécuter ces derniers dans la console Dev dans Kibana

PUT _template\binary 
{ 
      "template": "binary", 
      "mappings": { 
      "binary": { 
       "properties": { 

        "field1": { 
        "type": "binary" 
        } 
      } 
      } 
     }} 

PUT /binary/type/1 
{ 
    "field2":"abc" 
} 

GET binary/_search 
{ 
    "query": { 
     "bool": { 
      "must_not": { 
       "exists": { 
        "field": "field1" 
       } 
      } 
     } 
    } 
} 

Cela devrait retourner le document que vous venez d'indexer ... si vous changez à ce qui suit, il ne devrait pas rien parce que field2 est présent!

GET binary/_search 
{ 
    "query": { 
     "bool": { 
      "must_not": { 
       "exists": { 
        "field": "field2" 
       } 
      } 
     } 
    } 
} 
+0

Merci de votre aide. Cela fonctionne-t-il correctement pour les documents qui ont réellement 'field1', c'est-à-dire quand vous interrogez {bool: {must: {exists: {field:" field1 "}}}}? La dernière fois que j'ai essayé, ça n'a pas marché. Ou, comme dans votre exemple, si vous mettez un document qui a à la fois 'field1' et' field2'? Je soupçonne qu'ES ignore simplement le champ binaire sur la requête "Existe". – aaronqli

+1

Vous avez raison, si vous essayez explicitement de rechercher un champ binaire Elastic déclare qu'il n'est pas consultable mais que vous voulez renvoyer des documents qui n'ont pas le champ binaire défini, ce qui est possible en utilisant 'GET binary/type/_count { "requête": { "bool": { "must_not": { "existe": { "champ": "field1"} } } } } 'obtenir le nombre de documents dans un index est Assez simple, alors pouvez-vous soustraire l'un à l'autre? – greggers

+0

Cette requête (et _search) retourne tous les documents, peu importe si le champ binaire est défini ou non :( – aaronqli