ElasticSearch和Nest:为什么我错过了查询中的id字段?

时间:2015-11-20 19:00:26

标签: elasticsearch nest

我创建了一个简单的对象,它代表一个会议,其中包含时间,位置,名称,主题等元素,并通过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);
        }

我也试过了部分更新,没有运气。

2 个答案:

答案 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