net example c# elasticsearch nest

c# - example - ¿Cómo puedo asignar un solo tipo de.NET a múltiples tipos de objetos anidados en ElasticSearch/NEST?



elasticsearch c# (1)

Si entiendo correctamente tu intención, el objeto Entity solo tendrá objetos anidados en él, ¿no?

Puede intentar utilizar la funcionalidad de asignación dinámica de elasticsearch para el objeto entidad. Supongo que Entity es un objeto raíz.

curl -X POST localhost:9200/myindex/entity/_mapping {"dynamic_templates": [ {"nested_data_template": { "mapping": { "type": "nested" }, "match_mapping_type": "object", "path_match": "*" }}]}

path_match: * y match_mapping_type: object significa que para todos los nombres de campo con objeto como valor se aplicará la asignación de tipo.

Usando NEST y Fluent API puedes usar la siguiente API. IntelliSense le guiará sobre cómo construir el mapeo arriba. ;)

descriptor.DynamicTemplates(DynamicTemplatesDescriptor<Entity>)

Cada vez que aparece una nueva propiedad que coincida con esta plantilla, elasticsearch actualizará la asignación en función de la asignación dinámica. Después de un tiempo, su mapeo se verá así:

{ "entity": { "mappings": { "entity": { "dynamic_templates": [ { "nested_data_template": { "mapping": { "type": "nested" }, "match_mapping_type": "object", "path_match": "*" } } ], "properties": { "test": { "type": "nested", "properties": { "test": { "type": "string" }, "another_property": { "type": "string" } } }, "test1": { "type": "nested", "properties": { "test": { "type": "string" } } } } } } } }

Espero que esto ayude!

Estoy usando la biblioteca NEST para interactuar con ElasticSearch, y estoy tratando de encontrar una manera de crear tipos de índice / objetos anidados basados ​​en datos que no sean de tipo. El tipo tiene la siguiente estructura básica.

public class Entity : DynamicObject { public string Id { get; set; } // a bunch of other simple properties public override IEnumerable<string> GetDynamicMemberNames() { return Data.Select(x => x.Name); } public override bool TryGetMember(GetMemberBinder binder, out object result) { var dictionary = Data.First(x => x.Name == binder.Name); result = dictionary; return true; } // each instance of one these should be a nested object type public IList<NestedType> Data { get; set; } public class NestedType { // How do I make Name be the nest type name? public string Name { get; set; } public IDictionary<string, string> Values { get; set; } } }

Quiero crear un objeto / tipo anidado para cada instancia de NestedType. Entonces, si hay dos instancias de NestedType, habrá dos objetos anidados. Puedo heredar NestedType de DynamicObject para convertir el diccionario en propiedades "reales" que NEST luego correlaciona correctamente (es decir, convertir cada clave de diccionario en una propiedad). El problema es que no puedo encontrar la manera de establecer el nombre / tipo del objeto anidado.

Hay dos maneras de mapear nombres que conozco: el atributo ElasticType y la interfaz fluida NestedObject. El problema aquí es que hay un solo tipo que representa múltiples tipos de objetos anidados. Podría construir algunos tipos de tiempo de ejecución, pero prefiero no si puedo evitarlo.

¿Hay alguna manera de utilizar un método o propiedad como el nombre / tipo del objeto anidado? ¿O hay un mejor enfoque para asignar este tipo de datos a ElasticSearch (con suerte a través de NEST)?

¡Gracias! Erick

EDITAR

Actualicé la definición de entidad para reflejar lo que estoy haciendo (utilizando DynamicObject para hacer que el JsonSerializer haga lo que quiero). Lo que quiero es la capacidad de los diferentes diccionarios para tener diferentes asignaciones, (diferentes tallos, analizadores, etc.). Si hubiera tipos adecuados, podría usar la sintaxis NEST con fluidez para configurarlo, pero cuando use dynamic, no hay ningún tipo de letra para la API fluida. En definitiva, quiero mezclar la API fluida con una cadena basada en cadenas en lugar de tipos. ¿Esto tiene sentido?