elasticsearch nest index relational database -
i've indexed 2 separate tables elasticsearch - meetings , meetingattendees. 1 many relationship - meeting can have many attendees.
meetings
id: 1
id: 2
meeting attendees
meetingattendeeid: 1
meetingid: 1
name: "tom"
meetingattendeeid: 2
meetingid: 1
name: "david"
meetingattendeeid: 3
meetingid: 2
name: "david"
i've tried create relationship this, i'm not seeing difference in es
client.createindex(ci => ci.index("testmappingindex") .addmapping<meeting>(m => m.mapfromattributes()) .addmapping<meetingattendee>(m => m.mapfromattributes().setparent<meeting>()));
i'd able query 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, mapping isn't working, don't see request going out in fiddler, , i'm not sure if did work query return meetings david attendee.
i'm recommending nested object handle relationship between meeting
, attendee
. means storing data in 1 document(meeting).
meeting , 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 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 query 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 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 case going index more related data can worth have 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, have find parent children. nest can query:
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"))))));
Comments
Post a Comment