【发布时间】:2014-11-04 20:48:51
【问题描述】:
我正在构建一个 API 应用程序,该应用程序本质上允许用户构建一个文档,该文档可以按照他们想要的方式进行结构化,并将存储在 Elasticsearch 中。本质上,我为用户提供了一个简单的界面来访问我们的 Elasticsearch 实例。我试图使实现尽可能简单。这是我目前正在处理的问题。
预期主体的对象:
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; }
}
简单实现:
[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);
}
这很好用,但它在源中包含索引、类型和 ID。我真正想做的只是在索引时提供这三个信息,但实际上只是索引 document.Document,它是动态类型的。但是,这似乎与 Nest 不一致,因为它会在 IDE 和编译时引发错误:
“匿名函数或方法组不能用作动态绑定操作的组成值”
“不能使用 lambda 表达式作为动态调度操作的参数,除非先将其转换为委托或表达式树类型”。
我怎样才能只索引document.Document?有没有比使用动态类型更好的方法来处理未知结构的传入 JSON 文档?
【问题讨论】:
标签: c# elasticsearch asp.net-web-api nest