简体   繁体   English

elasticsearch嵌套索引关系数据库

[英]elasticsearch nest index relational database

I've indexed 2 separate tables into Elasticsearch - Meetings and MeetingAttendees. 我已经在Elasticsearch中将2个单独的表编入索引-Meetings和MeetingAttendees。 A one to many relationship - a meeting can have many attendees. 一对多关系-会议可以有很多与会者。

Meetings 会议会议
ID: 1 编号:1

ID: 2 编号:2

Meeting Attendees 会议参加者
MeetingAttendeeID: 1 MeetingAttendeeID:1
MeetingID: 1 MeetingID:1
Name: "tom" 名称:“ tom”

MeetingAttendeeID: 2 MeetingAttendeeID:2
MeetingID: 1 MeetingID:1
Name: "david" 名称:“大卫”

MeetingAttendeeID: 3 MeetingAttendeeID:3
MeetingID: 2 MeetingID:2
Name: "david" 名称:“大卫”

I've tried to create the relationship like this, but I'm not seeing any difference in ES 我已经尝试过建立这样的关系,但是我看不到ES有任何区别

client.CreateIndex(ci => ci.Index("testmappingindex")
                .AddMapping<Meeting>(m => m.MapFromAttributes())
                .AddMapping<MeetingAttendee>(m => m.MapFromAttributes().SetParent<Meeting>()));

I'd like to be able to query like this: 我希望能够这样查询:

result = client.Search<Meeting>(s => s
                .Type("Meeting")
                .From(0)
                .Size(10)
                .Query(q => q.MeetingAttendees(ma => ma.Terms(t => t.Name == "david")))
                    )
            ).Documents.ToList();

However, the mapping isn't working, I don't see any request going out in fiddler, and I'm not sure if it did work that this query would return the meetings with David as the attendee. 但是,映射不起作用,我看不到提琴手发出任何请求,并且我不确定此查询是否会返回以David作为与会者的会议是否奏效。

I'm recommending you Nested Object to handle relationship between Meeting and Attendee . 我建议您使用嵌套对象来处理MeetingAttendee之间的关系。 It means we will be storing all data in one document(Meeting). 这意味着我们将所有数据存储在一个文档中(会议)。

Meeting and Attendee classes: 会议和参加者课程:

public class Meeting
{
    public int Id { get; set; }
    public string Name { get; set; }
    [ElasticProperty(Type = FieldType.Nested)]
    public List<Attendee> MeetingAttendees { get; set; }
}

public class Attendee
{
    public int Id { get; set; }
    public string Name { get; set; }
}

Create index: 创建索引:

var indicesOperationResponse = client.CreateIndex(descriptor => descriptor
    .Index(indexName)
    .AddMapping<Meeting>(m => m.MapFromAttributes()));

Index some data: 索引一些数据:

var david = new Attendee {Id = 1, Name = "David"};
var carl = new Attendee {Id = 2, Name = "Carl"};
var jason = new Attendee {Id = 3, Name = "Jason"};

client.Index(new Meeting {Id = 1, Name = "Meeting1", MeetingAttendees = new List<Attendee>{david, carl}});
client.Index(new Meeting {Id = 2, Name = "Meeting2", MeetingAttendees = new List<Attendee>{jason}});
client.Index(new Meeting {Id = 3, Name = "Meeting3", MeetingAttendees = new List<Attendee>{jason, david}});

client.Refresh();

We should modify your query just a little bit: 我们应该稍微修改一下您的查询:

var result = client.Search<Meeting>(s => s
    .From(0)
    .Size(10)
    .Query(q => q.Nested(n => n
        .Path(p => p.MeetingAttendees.First())
        .Query(qq => qq
            .Term(meeting => meeting.OnField(f => f.MeetingAttendees.First().Name).Value("david"))))));

Result from elasticsearch: elasticsearch的结果:

{
   "took": 4,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 2,
      "max_score": 1.4054651,
      "hits": [
         {
            "_index": "my_index",
            "_type": "meeting",
            "_id": "1",
            "_score": 1.4054651,
            "_source": {
               "id": 1,
               "name": "Meeting1",
               "meetingAttendees": [
                  {
                     "id": 1,
                     "name": "David"
                  },
                  {
                     "id": 2,
                     "name": "Carl"
                  }
               ]
            }
         },
         {
            "_index": "my_index",
            "_type": "meeting",
            "_id": "3",
            "_score": 1.4054651,
            "_source": {
               "id": 3,
               "name": "Meeting3",
               "meetingAttendees": [
                  {
                     "id": 3,
                     "name": "Jason"
                  },
                  {
                     "id": 1,
                     "name": "David"
                  }
               ]
            }
         }
      ]
   }
}

UPDATE: 更新:

In your case where you are going to index more related data it can be worth to have a look on parent-child relationship 如果您要为更多相关数据建立索引,则值得一看一下父子关系

Sample classes: 示例类:

public class Meeting
{
    public int Id { get; set; }
    public string Name { get; set; } 
}

public class Attendee
{
    public int Id { get; set; }
    public string Name { get; set; }
}

Mapping: 对应:

var indicesOperationResponse = client.CreateIndex(descriptor => descriptor
    .Index(indexName)
    .AddMapping<Meeting>(m => m.MapFromAttributes())
    .AddMapping<Attendee>(m => m.MapFromAttributes().SetParent<Meeting>()));

Sample data: 样本数据:

var david = new Attendee { Id = 1, Name = "David"};
var carl = new Attendee { Id = 2, Name = "Carl"};
var jason = new Attendee {Id = 3, Name = "Jason"};

client.Index(new Meeting {Id = 1, Name = "Meeting1"});
client.Index(new Meeting {Id = 2, Name = "Meeting2"});
client.Index(new Meeting {Id = 3, Name = "Meeting3"});

client.Index(david, descriptor => descriptor.Parent("1"));
client.Index(carl, descriptor => descriptor.Parent("1"));
client.Index(jason, descriptor => descriptor.Parent("2"));

client.Refresh();

Now, we have to find parent by their children . 现在,我们必须由他们的孩子找父母 With NEST you can do this by this query: 使用NEST,您可以通过以下查询执行此操作:

var searchResponse = client.Search<Meeting>(s => s
    .Query(q => q
        .HasChild<Attendee>(c => c
            .Query(query => query.Term(t => t.OnField(f => f.Name).Value("david"))))));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM