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

Popular posts from this blog

Java 3D LWJGL collision -

spring - SubProtocolWebSocketHandler - No handlers -

methods - python can't use function in submodule -