Loading

Extending EcsDocument

In instances where using the IDictionary<string, object> Metadata property is not sufficient, or there is a clearer definition of the structure of the ECS-compatible document you would like to index, it is possible to subclass the EcsDocument object and provide your own property definitions.

Through TryRead/ReceiveProperty/WriteAdditionalProperties you can hook into the EcsDocumentJsonConverter and read/write additional properties.

 /// <summary> /// An extended ECS document with an additional property /// </summary> [JsonConverter(typeof(EcsDocumentJsonConverterFactory))] public class MyEcsDocument : EcsDocument {	[JsonPropertyName("my_root_property"), DataMember(Name = "my_root_property")]	public MyCustomType MyRootProperty { get; set; }	protected override bool TryRead(string propertyName, out Type type)	{	type = propertyName switch	{	"my_root_property" => typeof(MyCustomType),	_ => null	};	return type != null;	}	protected override bool ReceiveProperty(string propertyName, object value) =>	propertyName switch	{	"my_root_property" => null != (MyRootProperty = value as MyCustomType),	_ => false	};	protected override void WriteAdditionalProperties(Action<string, object> write) => write("my_root_property", MyCustomType); } 

The Elastic.CommonSchema.BenchmarkDotNetExporter project takes this approach in the Domain source directory, where the BenchmarkDocument subclasses EcsDocument.