我希望在将文档索引到弹性搜索时自动生成 id。当我没有在我的 poco 中指定 Id 属性时,这可以正常工作。
我想做的是在获取和索引时使用自动生成的 id 时将底层 _id 字段映射到我的 poco 类上。看起来我可以指定 id 或根本不指定。我缺少他们的任何嵌套 api 选项吗?
编辑
我希望在将文档索引到弹性搜索时自动生成 id。当我没有在我的 poco 中指定 Id 属性时,这可以正常工作。
我想做的是在获取和索引时使用自动生成的 id 时将底层 _id 字段映射到我的 poco 类上。看起来我可以指定 id 或根本不指定。我缺少他们的任何嵌套 api 选项吗?
编辑
正如@Duc.Duong 在评论中所说,您可以使用DocumentWithMeta
. 在当前版本的 NEST中,您应该将DocumentsWithMetaData
其替换为from to 。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 会自动设置为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
}
似乎 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; }
}