我创建了一个简单的对象,它代表一个会议,其中包含时间,位置,名称,主题等元素,并通过Nest在ElasticSearch中对其进行索引。它有一个Id字段,我留空,以便ES可以生成它们。
稍后我检索了所有缺少GEO坐标的文档,以便我可以更新它们。我的所有返回元素对于id字段仍然为null,当我将它们更新回ES时,它会为它们创建新文档。
我在这里错过了什么让我的所有身份都归零?
谢谢
这是Meeting类(id prop是多余的,但无论如何我都试过了)
[ElasticType(IdProperty = "Id")]
public class Meeting
{
public string Id { get; set; }
public string Code { get; set; }
public string Day { get; set; }
public string Town { get; set; }
public string Name { get; set; }
public string Location { get; set; }
public string OriginalTime { get; set; }
public string OriginalTimeCleaned { get; set; }
public string Handicap { get; set; }
public string FormattedAddress { get; set; }
public Coordinates Coordinates { get; set; }
public List<MeetingTime> Times = new List<MeetingTime>();
public bool IsProcessed { get; set; }
}
以下是我检索会议的方式
public static List<Meeting> GetAddressesWithMissingCoordinates()
{
var result = Client.Search<Meeting>(s => s
.Index("meetings")
.AllTypes()
.Query(p => p.Filtered(f => f.Filter(x => x.Missing(c => c.Coordinates)))));
return result.Documents.ToList();
}
这是我的更新声明,Id为空
public static void UpdateMeetingCoordinates(Meeting meeting, Coordinates coordinates)
{
meeting.Coordinates = coordinates;
var response = Client.Index(meeting, u => u
.Index("meetings")
.Type("meeting")
//.Id(meeting.Id.ToString())
.Refresh()
);
Console.WriteLine(response);
}
我也试过了部分更新,没有运气。
答案 0 :(得分:5)
有一种获取内部ID的方法,如this issue中所述,请求此功能。
而不是使用response.Documents
,而是执行此操作:
var results = response.Hits.Select(hit =>
{
var result = hit.Source;
result.Id = hit.Id;
return result;
});
答案 1 :(得分:4)
Elasticsearch设置了一个"_id"
元数据参数(如果你没有指定一个值,它会选择一个值),但它不会在你的文档源中设置该值
为了说明,如果我创建一个简单的索引:
PUT /test_index
然后给它几个文档,而不指定"_id"
:
POST /test_index/doc/_bulk
{"index":{}}
{"id":null,"name":"doc1"}
{"index":{}}
{"id":null,"name":"doc2"}
然后搜索:
POST /test_index/_search
这就是我的回忆:
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 1,
"hits": [
{
"_index": "test_index",
"_type": "doc",
"_id": "AVEmuVlmj_RE0PsHCpza",
"_score": 1,
"_source": {
"id": null,
"name": "doc2"
}
},
{
"_index": "test_index",
"_type": "doc",
"_id": "AVEmuVlmj_RE0PsHCpzZ",
"_score": 1,
"_source": {
"id": null,
"name": "doc1"
}
}
]
}
}
请注意,为两个文档设置了"_id"
元数据参数,但我传递的"id"
字段未更改。这是因为,就Elasticsearch而言,"id"
只是另一个文档字段。
(这是我使用的代码:http://sense.qbox.io/gist/777dafae88311c4105453482050c64d69ccd09db)