使用NEST索引动态对象

我正在构建一个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表达式转换为委托或表达式树类型之前,不能将lambda表达式用作动态调度操作的参数”。

我怎样才能索引document.Document呢?有没有比使用动态类型更好的方法来处理结构未知的传入JSON文档?

回答:

有两种方法可以做到这一点。

尝试将索引建立为动态类型是行不通的,但是您可以通过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);

或者如果批量处理文件

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(或更准确地说,Elasticsearch.Net)也有一个.Raw方法变体附加到ElasticClient类,该变体可以索引原始JSON。使用Raw.Index()让我们做这样的事情:

string documentJson = JsonConvert.SerializeObject(document.Document);

ElasticsearchResponse<string> result = esClient.Raw.Index(document.Index, document.Type, document.Id, documentJson);

响应的类型描述符是您期望响应位于的类型(字符串表示您将拥有序列化的json响应,可以对其进行反序列化并对其进行处理)。这使我们可以回避整个对象类型问题,并且NEST完全按预期将文档索引到Elasticsearch中。

以上是 使用NEST索引动态对象 的全部内容, 来源链接: utcz.com/qa/404585.html

回到顶部