gpt4 book ai didi

c# - 使用 NEST 索引动态对象

转载 作者:可可西里 更新时间:2023-11-01 08:58:07 26 4
gpt4 key购买 nike

我正在构建一个 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 和编译时引发错误:

"An anonymous function or method group cannot be used as a constituent value of a dynamically bound operation"

"Cannot use a lambda expression as an argument to a dynamically dispatched operation without first casting it to a delegate or expression tree type".

我怎样才能只索引 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)也有一个附加到 ElasticClient 类的 .Raw 方法变体,它可以索引原始 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 中。

关于c# - 使用 NEST 索引动态对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26744742/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com