create - ¿Cuál es la diferencia entre_source y_all en Elasticsearch
filter path elasticsearch (1)
Es prácticamente lo mismo que la diferencia entre los campos indexados y los almacenados en lucene.
Utiliza los campos indexados cuando quiere buscar en ellos, mientras almacena los campos que desea devolver como resultados de búsqueda.
El campo _source
está destinado a almacenar todo el documento original que se envió originalmente a elasticsearch. Es uso como resultado de búsqueda, para ser recuperado. No puedes buscar en eso. De hecho, es un campo almacenado en lucene y no indexado.
El campo _all
está destinado a indexar todo el contenido que proviene de todos los campos de los que están compuestos sus documentos. Puede buscar en él pero nunca devolverlo, ya que está indexado pero no almacenado en lucene.
No hay redundancia, los dos campos están destinados a un uso diferente y se almacenan en diferentes lugares, dentro del índice lucene. El campo _all
convierte en parte de lo que llamamos el índice invertido, se utiliza para indexar texto y poder ejecutar la búsqueda de texto completo en su contra, mientras que el campo _source
simplemente se almacena como parte de los documentos de lucene.
Nunca usaría el campo _source
en sus consultas, solo cuando obtenga resultados, ya que eso es lo que elasticsearch devuelve de forma predeterminada. Hay algunas funciones que dependen del campo _source
, que usted pierde si lo deshabilita. Uno de ellos es la API de actualización . Además, si lo deshabilita, debe recordar configurar como store:yes
en su asignación todos los campos que desea devolver como resultados de búsqueda. Preferiría decir que no lo desactive a menos que le moleste, ya que es realmente útil en muchos casos. Otro caso de uso común sería cuando necesite reindexar sus datos; simplemente puede recuperar todos sus documentos de elasticsearch y simplemente reenviarlos a otro índice.
Por otro lado, el campo _all
es simplemente un campo de captura por defecto, que puede usar cuando solo desea buscar en todos los campos disponibles y no desea especificarlos todos en sus consultas. Es útil, pero no confiaría demasiado en la producción, donde es mejor ejecutar consultas más complejas en diferentes campos, con diferentes pesos cada una. Es posible que desee deshabilitarlo si no lo usa, esto tendrá un impacto menor que la desactivación del _source
en mi opinión.
La diferencia entre los dos, que tienen todos los campos, me elude.
Si mi documento tiene:
{"mydoc":
{"properties":
{"name":{"type":"string","store":"true"}},
{"number":{"type":"long","store":"false"}},
{"title":{"type":"string","include_in_all":"false","store":"true"}}
}
}
Entiendo que _source es un campo que tiene todos los campos. Pero también lo hace _todos? ¿Esto significa que "nombre" se guarda varias veces (dos veces? En _src y en _todo), lo que aumenta el espacio en disco del documento?
¿Se almacena "nombre" una vez para el campo, una vez para _source, y una vez para _all? ¿qué pasa con "number", está almacenado en todos, aunque no en _source?
¿Cuándo debería usar _source en mi consulta y cuándo _all?
¿Cuál es el caso de uso donde puedo desactivar "_all" y qué funcionalidad me sería negada?