586 votes

Faire en sorte qu'elasticsearch ne renvoie que certains champs ?

J'utilise elasticsearch pour indexer mes documents.

Est-il possible de lui demander de ne renvoyer que des champs particuliers au lieu du document json entier qu'il a stocké ?

1 votes

elastic.co/guide/fr/elasticsearch/reference/current/ Notez que vous pouvez également exclure certains champs seulement.

815voto

kevingessner Points 7257

Yep, utiliser une meilleure option filtre source . Si vous effectuez une recherche avec JSON, cela ressemblera à quelque chose comme ceci :

{
    "_source": ["user", "message", ...],
    "query": ...,
    "size": ...
}

Dans l'ES 2.4 et les versions antérieures, vous pouviez également utiliser la fonction de l'API de recherche :

{
    "fields": ["user", "message", ...],
    "query": ...,
    "size": ...
}

Ceci est déprécié dans ES 5+. Et les filtres de source sont plus puissants de toute façon !

13 votes

Assurez-vous de les définir comme "stockés" : true dans le mapping. Sinon, ES chargera toujours le document _source et chargera les champs à partir de là. Cela peut avoir un impact sur les performances si les données retournées sont relativement petites par rapport à la taille d'un document entier.

7 votes

Vous vouliez dire "store" : true

0 votes

Sont-elles faites dans le fichier conf ou à quel endroit exactement ?

104voto

Markus Coetzee Points 939

J'ai trouvé les documents pour le get api pour être utile - surtout les deux sections, Filtrage à la source y Champs : https://www.elastic.co/guide/en/elasticsearch/reference/7.3/docs-get.html#get-source-filtering

Ils parlent de filtrage à la source :

Si vous n'avez besoin que d'un ou deux champs de la _source complète, vous pouvez utiliser les paramètres _source_include & _source_exclude pour inclure ou pour inclure ou filtrer les parties dont vous avez besoin. Cela peut être particulièrement utile pour les documents volumineux pour lesquels l'extraction partielle permet d'économiser les frais de réseau.

Ce qui correspondait parfaitement à mon cas d'utilisation. J'ai fini par filtrer simplement la source comme ceci (en utilisant le raccourci) :

{
    "_source": ["field_x", ..., "field_y"],
    "query": {      
        ...
    }
}

Pour votre information, ils déclarent dans les docs au sujet de la champs paramètre :

L'opération get permet de spécifier un ensemble de champs enregistrés qui seront seront retournés en passant le paramètre fields.

Il semble s'occuper des champs qui ont été spécifiquement stockés, où il place chaque champ dans un tableau. Si les champs spécifiés n'ont pas été stockés, il va chercher chacun d'entre eux dans la _source, ce qui peut entraîner des récupérations plus lentes. J'ai également eu du mal à faire en sorte qu'elle renvoie des champs de type objet.

En résumé, vous avez deux possibilités : le filtrage à la source ou les champs [stockés].

32voto

Pinkesh Sharma Points 451

Pour les versions ES 5.X et supérieures, vous pouvez effectuer une requête ES de ce type :

    GET /.../...
    {
      "_source": {
        "includes": [ "FIELD1", "FIELD2", "FIELD3" ... " ]
      },
      .
      .
      .
      .
    }

25voto

Gaurav Points 164
here you can specify whichever field you want in your output and also which you don't.

  POST index_name/_search
    {
        "_source": {
            "includes": [ "field_name", "field_name" ],
            "excludes": [ "field_name" ]
        },
        "query" : {
            "match" : { "field_name" : "value" }
        }
    }

15voto

woltob Points 235

Dans Elasticsearch 5.x, l'approche mentionnée ci-dessus est dépréciée. Vous pouvez utiliser l'approche _source, mais dans certaines situations, il peut être utile de stocker un champ. Par exemple, si vous avez un document avec un titre, une date et un champ de contenu très large, vous pouvez vouloir récupérer uniquement le titre et la date sans avoir à extraire ces champs d'un grand champ _source :

Dans ce cas, vous utiliseriez :

{  
   "size": $INT_NUM_OF_DOCS_TO_RETURN,
   "stored_fields":[  
      "doc.headline",
      "doc.text",
      "doc.timestamp_utc"
   ],
   "query":{  
      "bool":{  
         "must":{  
            "term":{  
               "doc.topic":"news_on_things"
            }
         },
         "filter":{  
            "range":{  
               "doc.timestamp_utc":{  
                  "gte":1451606400000,
                  "lt":1483228800000,
                  "format":"epoch_millis"
               }
            }
         }
      }
   },
   "aggs":{  

   }
}

Consultez la documentation sur la manière d'indexer les champs stockés. Toujours heureux de recevoir un vote positif !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X