使用 NEST 5.0 索引动态对象

Index a dynamic object using NEST 5.0

我在 2 年前发现了这个问题 Index a dynamic object using NEST

我基本上有完全相同的问题,但使用的是 NEST 5.0。建议的解决方案在最新版本中不再有效。

在 NEST 5.x 中使用动态类型与在 NEST 1.x 中类似;一些客户端 API 在这些版本之间发生了一些变化,但前提仍然相同。

这是一个例子

var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
var defaultIndex = "default-index";
var connectionSettings = new ConnectionSettings(pool)
    .DefaultIndex(defaultIndex);

var client = new ElasticClient(connectionSettings);

// delete the index if it already exists
if (client.IndexExists(defaultIndex).Exists)
    client.DeleteIndex(defaultIndex);

client.CreateIndex(defaultIndex);

// create an anonymous type assigned to a dynamically typed variable
dynamic instance = new
{
    Name = "Russ",
    CompanyName = "Elastic",
    Date = DateTimeOffset.UtcNow
};

// cast the instance to object to index, explicitly
// specify the document type and index
var indexResponse = client.Index((object)instance, i => i
    .Type("my_type")
    .Index(defaultIndex)
);

// fetch the document just indexed
var getResponse = client.Get<dynamic>(indexResponse.Id, g => g
    .Type(indexResponse.Type)
    .Index(indexResponse.Index)
);

这个请求和响应JSON看起来像

HEAD http://localhost:9200/default-index?pretty=true

Status: 200

------------------------------

DELETE http://localhost:9200/default-index?pretty=true

Status: 200
{
  "acknowledged" : true
}

------------------------------

PUT http://localhost:9200/default-index?pretty=true 
{}

Status: 200
{
  "acknowledged" : true,
  "shards_acknowledged" : true
}

------------------------------

POST http://localhost:9200/default-index/my_type?pretty=true 
{
  "name": "Russ",
  "companyName": "Elastic",
  "date": "2017-03-11T04:03:53.0561954+00:00"
}

Status: 201
{
  "_index" : "default-index",
  "_type" : "my_type",
  "_id" : "AVq7iXhpc_F3ya7MTJiU",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "created" : true
}

------------------------------

GET http://localhost:9200/default-index/my_type/AVq7iXhpc_F3ya7MTJiU?pretty=true

Status: 200
{
  "_index" : "default-index",
  "_type" : "my_type",
  "_id" : "AVq7iXhpc_F3ya7MTJiU",
  "_version" : 1,
  "found" : true,
  "_source" : {
    "name" : "Russ",
    "companyName" : "Elastic",
    "date" : "2017-03-11T04:03:53.0561954+00:00"
  }
}

------------------------------

这表明文档已按预期编制索引,并且可以检索到原始源文档。

NEST 2.x 和 5.x 中的高级客户端可以通过 .LowLevel 属性 访问低级客户端,所以你可以做类似的事情

的相关问题
dynamic instance = new
{
    Id = "id",
    Index = defaultIndex,
    Type = "my_type",
    Document = new
    {
        Name = "Russ",
        CompanyName = "Elastic",
        Date = DateTimeOffset.UtcNow
    }
};

string documentJson = client.Serializer.SerializeToString((object)instance.Document);

var result = client.LowLevel.Index<string>(instance.Index, instance.Type, instance.Id, documentJson);