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é ?
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é ?
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 !
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.
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].
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 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.
1 votes
elastic.co/guide/fr/elasticsearch/reference/current/ Notez que vous pouvez également exclure certains champs seulement.