我希望在将文档索引到弹性搜索时自动生成id。这在我没有在我的poco中指定Id属性时正常工作。自动生成ID和映射_id NEST
我想要做的是将索引时获取和使用自动生成的id映射底下的_id字段到我的poco类。它看起来像我可以指定或根本没有。他们是否缺少任何嵌套api选项?
EDIT
例要旨 https://gist.github.com/antonydenyer/9074159
我希望在将文档索引到弹性搜索时自动生成id。这在我没有在我的poco中指定Id属性时正常工作。自动生成ID和映射_id NEST
我想要做的是将索引时获取和使用自动生成的id映射底下的_id字段到我的poco类。它看起来像我可以指定或根本没有。他们是否缺少任何嵌套api选项?
EDIT
例要旨 https://gist.github.com/antonydenyer/9074159
似乎NEST自动检测 “ID” 字段在类并将其映射到在ES “_id”。您的需求看起来很奇怪,但为什么不为它创建2个课程?一个用于索引(没有Id字段),一个用于获取(从索引类继承并声明新字段“Id”)?
例如为:
public class DataForIndex
{
public string Name { get; set; }
// some other fields...
}
public class DataForGet : DataForIndex
{
public int Id { get; set; }
}
感谢您的回应,不幸的是这不起作用。目前,我只是通过其他方式丰富了课堂的反应。这不是很优雅,只是想知道是否有更好的方法。 –
@antonydenyer你可以更新你的问题,为什么Duc.Duong建议的答案不起作用?这是解决此问题的最佳方法,但您还必须考虑该嵌套尝试猜测所用类的索引和类型名称。您可以通过指定类如何映射到ConnectionSettings上的索引/类型名来修复它们。 –
@MartijnLaarman我会尝试花点时间把我的意思放在一起,然后在这里发表。德永的建议是有道理的,但不幸的是,它对我来说并不适合我。我似乎记得在装饰班级和指定类型时,我无法确定。它可能就是这样。 –
正如@ Duc.Duong在评论中说,你可以使用DocumentWithMeta
访问ID。 在当前版本的NEST中,DocumentsWithMetaData
被替换为Hits
,并且您还应该将IHit<DataForGet>.Id
从string
转换为int
。
这是我的代码:
public class DataForIndex
{
public string Name { get; set; }
// some other fields...
}
public class DataForGet : DataForIndex
{
public int Id { get; set; }
}
var result = client.Search<DataForGet>(x => x.Index("index").MatchAll());
var list = results.Hits.Select(h =>
{
h.Source.Id = Convert.ToInt32(h.Id);
return h.Source;
}).ToList();
索引操作可以在不指定的ID来执行。在这种情况下,会自动生成一个id。另外,op_type会自动设置为创建。下面是一个例子(注意用来代替把POST):
$ curl -XPOST 'http://localhost:9200/twitter/tweet/' -d '{
"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch"
}'
结果:
{
"_index" : "twitter",
"_type" : "tweet",
"_id" : "6a8ca01c-7896-48e9-81cc-9f70661fcb32",
"_version" : 1,
"created" : true
}
是的,请记下使用的POST而不是PUT –
如果您使用POST,而不是把你的HTTP请求,elasticsearch会自动创建ID。 – uzay95