2013-10-23 98 views
6

我希望在将文档索引到弹性搜索时自动生成id。这在我没有在我的poco中指定Id属性时正常工作。自动生成ID和映射_id NEST

我想要做的是将索引时获取和使用自动生成的id映射底下的_id字段到我的poco类。它看起来像我可以指定或根本没有。他们是否缺少任何嵌套api选项?

EDIT

例要旨 https://gist.github.com/antonydenyer/9074159

+0

如果您使用POST,而不是把你的HTTP请求,elasticsearch会自动创建ID。 – uzay95

回答

-1

似乎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; } 
} 
+0

感谢您的回应,不幸的是这不起作用。目前,我只是通过其他方式丰富了课堂的反应。这不是很优雅,只是想知道是否有更好的方法。 –

+0

@antonydenyer你可以更新你的问题,为什么Duc.Duong建议的答案不起作用?这是解决此问题的最佳方法,但您还必须考虑该嵌套尝试猜测所用类的索引和类型名称。您可以通过指定类如何映射到ConnectionSettings上的索引/类型名来修复它们。 –

+0

@MartijnLaarman我会尝试花点时间把我的意思放在一起,然后在这里发表。德永的建议是有道理的,但不幸的是,它对我来说并不适合我。我似乎记得在装饰班级和指定类型时,我无法确定。它可能就是这样。 –

2

正如@ Duc.Duong在评论中说,你可以使用DocumentWithMeta访问ID。 在当前版本的NEST中,DocumentsWithMetaData被替换为Hits,并且您还应该将IHit<DataForGet>.Idstring转换为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(); 
2

Automatic ID Generation

索引操作可以在不指定的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 
} 
+0

是的,请记下使用的POST而不是PUT –