是否可以使用 ElasticSearch.Net 或 Nest 进行动态响应
Is it possible to use ElasticSearch.Net or Nest for dynamic response
有没有没有泛型的client.Read(...)
?我在 Nest nor ElasticSearch.Net.
中都没有找到 none
版本 1.5 有一个 IDocument
可能会解决我的问题,但我无法在 Elasticsearch5.5 中使用该版本。
ElasticSearch.Net 和 Nest 的所有示例、版本 5 和 6 都要求我在编译时知道响应的格式是通用的。例如。 Read<Customer>
(...)
我的问题是我们不知道数据库的格式,我们也不知道输出的格式;但它应该都是可配置的。
如果响应确实是动态的,您可以使用 dynamic
作为通用类型。
在 5.x 中,这将是 Json.NET 的 JObject
类型(因此,如果您愿意,可以改用 JObject
)。
在 6.x 中,dynamic
也可以工作,但实际类型将是内部 JObject
类型。如果您更愿意使用 Json.NET 的 JObject
类型,您可以 hook up Json.NET as the serializer using the NEST.JsonNetSerializer nuget package 用作文档的序列化程序,然后根据 5.x.
(回答我自己的问题感觉很奇怪,但我想展示结果代码以供将来参考。)
var settings = new ConnectionSettings(new Uri(@"http://localnhost:9200"))
.DefaultIndex("myindex");
var client = new ElasticClient(settings);
var res = client.Search<dynamic>(s => s
.AllTypes());
var rows = res.Documents;
Assert.IsTrue(rows.Count >= 1);
dynamic row = res.Documents.First();
Assert.AreEqual("50.7031526", row.POSITION.lat.ToString()); // It is case sensitive.
Assert.AreEqual(50.7031526, (double)row.POSITION.lat); // Convert to type explicitly.
有没有没有泛型的client.Read(...)
?我在 Nest nor ElasticSearch.Net.
版本 1.5 有一个 IDocument
可能会解决我的问题,但我无法在 Elasticsearch5.5 中使用该版本。
ElasticSearch.Net 和 Nest 的所有示例、版本 5 和 6 都要求我在编译时知道响应的格式是通用的。例如。 Read<Customer>
(...)
我的问题是我们不知道数据库的格式,我们也不知道输出的格式;但它应该都是可配置的。
如果响应确实是动态的,您可以使用 dynamic
作为通用类型。
在 5.x 中,这将是 Json.NET 的 JObject
类型(因此,如果您愿意,可以改用 JObject
)。
在 6.x 中,dynamic
也可以工作,但实际类型将是内部 JObject
类型。如果您更愿意使用 Json.NET 的 JObject
类型,您可以 hook up Json.NET as the serializer using the NEST.JsonNetSerializer nuget package 用作文档的序列化程序,然后根据 5.x.
(回答我自己的问题感觉很奇怪,但我想展示结果代码以供将来参考。)
var settings = new ConnectionSettings(new Uri(@"http://localnhost:9200"))
.DefaultIndex("myindex");
var client = new ElasticClient(settings);
var res = client.Search<dynamic>(s => s
.AllTypes());
var rows = res.Documents;
Assert.IsTrue(rows.Count >= 1);
dynamic row = res.Documents.First();
Assert.AreEqual("50.7031526", row.POSITION.lat.ToString()); // It is case sensitive.
Assert.AreEqual(50.7031526, (double)row.POSITION.lat); // Convert to type explicitly.