c# - name - php header robots no index
Indexe un objeto dinĂ¡mico usando NEST (1)
Hay un par de formas de hacer esto.
Intentar indexar el documento como tipo dinámico no funcionará, pero puede indexarlo como un objeto a través del objeto IndexRequest.
dynamic dynamicDoc = new { /*fill in document format here*/ };
ElasticClient esClient = new ElasticClient(esSettings);
IndexRequest<object> request = new IndexRequest<object>(dynamicDoc)
{
Index = "someindex",
Type = "SomeType",
Id = "someid"
};
esClient.Index<object>(request);
O si se trata de documentos a granel
List<dynamic> Documents = new List<dynamic>();
//Populate Documents
BulkDescriptor descriptor = new BulkDescriptor();
foreach(var doc in Documents)
{
descriptor.Index<object>(i => i
.Index("someindex")
.Type("SomeType")
.Id("someid")
.Document(doc));
}
esClient.Bulk(descriptor);
NEST (o más precisamente, Elasticsearch.Net) también tiene una variante de método .Raw asociada a la clase ElasticClient, que puede indexar JSON sin formato. Usando Raw.Index () permitanos hacer cosas como esta:
string documentJson = JsonConvert.SerializeObject(document.Document);
ElasticsearchResponse<string> result = esClient.Raw.Index(document.Index, document.Type, document.Id, documentJson);
El descriptor de tipo para la respuesta es del tipo en el que esperará que esté la respuesta (cadena significa que tendrá una respuesta json serializada que puede deserializar y hacer algo). Esto nos permite eludir todo el problema de tipo de objeto y NEST indexa el documento en Elasticsearch exactamente como se esperaba.
Estoy construyendo una aplicación API que esencialmente permite a un usuario construir un documento, que se puede estructurar como lo desee, que se almacenará en Elasticsearch. Básicamente, proporciono una interfaz simple para que los usuarios accedan a nuestra instancia de Elasticsearch. Estoy tratando de mantener la implementación lo más simple posible. Esto es lo que estoy tratando hasta ahora.
El objeto para el cuerpo esperado:
public class DocumentModel
{
public string Index { get; set; }
public string Type { get; set; }
public string Id { get; set; }
[ElasticProperty(Type = FieldType.Nested)]
public dynamic Document { get; set; }
}
Implementación simple:
[HttpPost]
[Route("")]
public IHttpActionResult Post(DocumentModel document)
{
Uri nodeLocation = new Uri("http://localhost:9200");
IConnectionPool connectionPool = new SniffingConnectionPool(new List<Uri> { nodeLocation });
ConnectionSettings settings = new ConnectionSettings(connectionPool);
ElasticClient esClient = new ElasticClient(settings);
IIndexResponse result = esClient.Index(document, i => i
.Index(document.Index)
.Type(document.Type)
.Id(document.Id));
return Ok(result.IsValid);
}
Esto funciona bien, pero incluye el índice, tipo e Id en la fuente. Lo que realmente me gustaría hacer es simplemente proporcionar esos tres elementos de información al indexar, pero en realidad solo indexar documento. Documento, que es de tipo dinámico. Pero parece estar en desacuerdo con Nest, ya que arroja un error en el IDE y en tiempo de compilación:
"Una función anónima o grupo de métodos no se puede usar como valor constitutivo de una operación enlazada dinámicamente"
"No se puede usar una expresión lambda como argumento para una operación distribuida dinámicamente sin primero enviarla a un tipo de delegado o árbol de expresiones".
¿Cómo puedo indexar solo document.Document
? ¿Hay una forma mejor de manejar un documento JSON entrante de estructura desconocida que usar un tipo dinámico?