web-dev-qa-db-fra.com

Pourquoi ai-je besoin de "store": "yes" dans elasticsearch?

Je ne comprends vraiment pas pourquoi dans lien des types de base il dit dans les descriptions des attributs (pour un nombre, par exemple):

  1. store - Définissez sur yes pour stocker le champ réel dans l'index, non pour ne pas le stocker. La valeur par défaut est no (notez, le document JSON lui-même est stocké et peut être récupéré à partir de celui-ci )
  2. index - Définissez sur no si la valeur ne doit pas être indexée. Dans ce cas, store doit être défini sur yes, car s'il n'est ni indexé ni stocké, il n'y a rien à voir avec cela

Les deux parties audacieuses semblent se contredire. Si "index":"no", "store":"no" Je pourrais toujours obtenir la valeur de la source. Cela pourrait être utile si j'ai un champ contenant une URL par exemple. Non?

J'ai eu une petite expérience, où j'ai eu deux mappages, dans un champ a été défini sur "store":"yes" et dans l'autre à "store":"no".

Dans les deux cas, je pourrais toujours spécifier dans ma requête:

{"query":{"match_all":{}}, "fields":["my_test_field"]}

et j'ai obtenu la même réponse, en retournant le champ.

Je pensais que si "store" est réglé sur "no" cela signifierait que je ne pourrais pas récupérer le champ spécifique, mais que je devrais obtenir l'ensemble _source et l'analyser côté client.

Alors, quel avantage y a-t-il à définir "store" à "yes"? Est-ce pertinent uniquement si j'exclus le champ du "_source" champ explicitement?

61
eran

Je pensais que si "store" était réglé sur "no", cela signifierait que je ne pourrais pas récupérer le champ spécifique, mais que je devais obtenir la _source entière et l'analyser côté client.

C'est exactement ce que fait elasticsearch pour vous lorsqu'un champ n'est pas stocké (par défaut) et que le _source le champ est activé (par défaut aussi).

Vous envoyez généralement un champ à elasticsearch car vous voulez soit le rechercher, soit le récupérer. Mais il est vrai que si vous ne stockez pas le champ explicitement et que vous ne désactivez pas la source, vous pouvez toujours récupérer le champ en utilisant le _source. Cela signifie que dans certains cas, il peut être judicieux d'avoir un champ qui n'est ni indexé ni stocké.

Lorsque vous stockez un champ, cela se fait dans la lucène sous-jacente. Lucene est un index inversé, qui permet une recherche rapide en texte intégral et renvoie les identifiants des documents en fonction des requêtes de texte. Au-delà de l'index inversé, Lucene a une sorte de stockage où les valeurs de champ peuvent être stockées afin d'être récupérées en fonction d'un identifiant de document. Vous stockez généralement dans lucene les champs que vous souhaitez renvoyer en tant que résultats de recherche. Elasticsearch n'a pas besoin de stocker tous les champs que vous souhaitez renvoyer car il stocke toujours par défaut tous les documents que vous lui envoyez, il est donc toujours en mesure de renvoyer tout ce que vous lui avez envoyé comme résultat de la recherche.

Dans quelques cas, il peut être utile de stocker les champs explicitement dans lucene: lorsque le _source est désactivé, ou lorsque nous voulons éviter de l'analyser, même si l'analyse est effectuée automatiquement par elasticsearch. Gardez à l'esprit que la récupération de nombreux champs stockés à partir de lucene peut nécessiter une recherche de disque par champ tout en récupérant uniquement le _source de lucene et en l'analysant afin de récupérer les champs nécessaires est juste une recherche de disque unique et juste plus rapide dans la plupart des cas.

104
javanna

Par défaut dans elasticsearch, le _source (le document indexé) est stocké. Cela signifie que lorsque vous effectuez une recherche, vous pouvez récupérer la source réelle du document. De plus, elasticsearch extraira automatiquement fields / objects du _source et les renvoyer si vous le demandez explicitement (ainsi que éventuellement l'utiliser dans d'autres composants, comme la mise en évidence).

Vous pouvez spécifier qu'un champ spécifique est également stocké. Cela signifie que les données de ce champ seront stockées seules . Ce qui signifie que si vous demandez field1 (qui est stocké), elasticsearch identifiera ce qui est stocké et le chargera à partir de l'index au lieu de le récupérer à partir du _source (en supposant que _source est activé).

Quand souhaitez-vous activer le stockage de champs spécifiques? La plupart du temps, non. La récupération de la _source est rapide et son extraction est également rapide. Si vous avez de très gros documents, où le coût de stockage du _source, ou le coût de l'analyse du _source est élevé, vous pouvez explicitement mapper certains champs à stocker à la place.

Remarque: il y a un coût de récupération de chaque champ stocké. Ainsi, par exemple, si vous avez un json avec 10 champs de taille raisonnable, que vous les mappez tous tels qu'ils sont stockés et que vous les demandez tous, cela signifie charger chacun (plus de recherches de disque), par rapport au simple chargement du _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 tout ce fil pour bien le comprendre . entrez la description du lien ici

3
Sudhanshu Gaur