我希望在將文檔索引到彈性搜索時自動生成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