我想在将文档索引到弹性搜索时自动生成id。当我没有在我的poco中指定Id属性时,这可以正常工作。
我想要做的是在获取索引时使用自动生成的id将底层的_id字段映射到我的poco类。看起来我可以指定id或者根本不指定id。他们是否缺少任何我认为的巢api选项?
修改
答案 0 :(得分:2)
正如@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();
答案 1 :(得分:2)
可以在不指定id的情况下执行索引操作。在这种情况下,将自动生成id。此外,op_type将自动设置为create。这是一个例子(注意使用POST而不是PUT):
$ 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
}
答案 2 :(得分:-1)
似乎NEST在类中自动检测“Id”字段并将其映射到ES中的“_id”。您的要求看起来很奇怪,但为什么不为它创建2个类?一个用于索引(没有Id字段),一个用于获取(从索引类继承并声明新字段“Id”)?
e.g:
public class DataForIndex
{
public string Name { get; set; }
// some other fields...
}
public class DataForGet : DataForIndex
{
public int Id { get; set; }
}