2013-10-23 97 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 –