Elasticsearch champ de magasin vs _source
L'Aide D'Elasticsearch 1.4.3
Je suis en train de construire une sorte de "reporting" du système. Et le client peut choisir et de choisir les champs qui ils veulent retournés dans leur résultat.
Dans 90% des cas, le client ne sera jamais ramasser tous les domaines, alors j'ai pensé que je peux désactiver _source champ dans ma cartographie pour économiser de l'espace. Mais j'ai ensuite appris que
GET myIndex/myType/_search/
{
"fields": ["field1", "field2"]
...
}
Ne pas renvoyer les champs.
Donc je suppose que je dois alors utiliser le "magasin": true pour chaque champ. De ce que j'ai lu ce sera plus rapide pour les recherches, mais je suppose que l'espace sage, il sera le même que _source ou nous avons encore économiser de l'espace?
- J'ai fait quelques tests. Inséré 4 types x 100 000 chaque = 400 000 par index. _source: true = 45 MO _source: true, _all: false = 34 _source: false = 30 MO _source: false, _all: false = 18MO _source: false, store: vrai (tous les champs) = 39.5 MB _source: false, store: vrai (tous les champs), _all:false = 28.5 MO
Vous devez vous connecter pour publier un commentaire.
La
_source
champ stocke le JSON que vous envoyez à Elasticsearch et vous pouvez choisir de retourner uniquement certains champs si nécessaire, ce qui est parfait pour votre cas d'utilisation. Je n'ai jamais entendu dire que la stockées champs sera plus rapide pour les recherches. Le_source
champ pourrait être plus d'espace disque, mais si vous devez stocker tous les le terrain il n'est pas nécessaire d'utiliser les champs stockés sur le_source
champ. Si vous désactivez le champ source, il signifie:Elasticsearch cluster, vous devrez à nouveau l'index à partir de la source de données
(ce qui est généralement beaucoup plus lent).
Par défaut dans elasticsearch, le
_source
(le document d'une indexée) est stocké. Cela signifie que lorsque vous effectuez une recherche, vous pouvez obtenir la réelle source du document de retour. En outre, elasticsearch extrait automatiquementfields/objects
de la_source
et de les retourner si vous le demander explicitement (ainsi que peut-être l'utiliser dans d'autres composantes, telles que le surlignage).Vous pouvez spécifier qu'un champ spécifique est également enregistrée. Cela signifie que les données de ce champ sera stocké sur son propre. Ce qui signifie que si vous demandez
field1
(qui est stockée), elasticsearch indique qu'il est stocké, et de le charger à partir de l'index au lieu de l'obtenir à partir de la_source
(en supposant que_source
est activé).Lorsque vous voulez activer le stockage des domaines particuliers? La plupart du temps, vous n'avez pas. L'extraction de l'
_source
est rapide et l'extraction il est rapide. Si vous avez des documents de très grande taille, où le coût de stockage du_source
, ou le coût de l'analyse de la_source
est élevé, vous pouvez explicitement carte quelques champs à être stockée à la place.Remarque, il y a un coût de la récupération de chaque champ stocké. Ainsi, par exemple, si vous avez un json avec 10 champs de taille raisonnable, et vous carte tous stockée, et de demander à tous d'entre eux, cela signifie que le chargement de chacun (plus de disque cherche), comparativement à un peu le chargement de la
_source
(qui est un champ, éventuellement compressé).J'ai obtenu cette réponse sur le lien ci-dessous répondu par shay.banon vous pouvez lire l'ensemble de ce thread pour obtenir une bonne compréhension de ce sujet. entrez description du lien ici
Permettant
_source
permettra de stocker l'intégralité du document JSON dans l'index tout enstore
ne stockez les champs qui sont marqués de la sorte. Donc, en utilisantstore
peut-être mieux que d'utiliser_source
si vous voulez économiser de l'espace disque.Clinton Gormley est dit dans le lien ci-dessous
https://groups.google.com/forum/#!topic/elasticsearch/j8cfbv-j73g/discussion
par défaut, ES magasins de votre JSON doc dans le _source champ, qui est
réglé sur "stockés"
par défaut, les champs de votre JSON doc sont définis pour ne PAS être "stockée"
(c'est à dire stocké comme un champ distinct)
alors quand ES renvoie votre doc (la recherche ou de l'obtenir), il suffit de charger la _source
champ et des rendements, c'est à dire une simple recherche sur disque
Certaines personnes pensent qu'en les stockant sur des champs individuels, il sera plus rapide
que le chargement de l'ensemble du JSON doc de la _source champ. Ce qu'ils ne
réaliser, c'est que chaque champ stocké nécessite une recherche de disque (10ms chaque cherche!
), et que la somme de ceux que vise l'emporte de loin sur le coût de la juste
l'envoi de la _source champ.
En d'autres termes, il est presque toujours faux optimisation.