I would like to use Elasticsearch.Net/NEST to search related documents. For example, I have:
Person:
id name address_id
-- ---- ----------
1 John 1
2 Mary 2
Address:
id city
-- ------
1 Boston
2 Berlin
I'd like to store the Person and Address documents separately, and do queries where I return Person documents based on Address fields. For example, return all documents for people living in Boston. I've seen some examples in the Elaticsearch documentation using mapping and parent/child directives, but nothing for Elasticsearch.Net/NEST. Any code samples or pointers would be greatly appreciated...
Here's a small snippet where the address is the parent
EDIT: Create the index:
var indicesOperationResponse = _client.CreateIndex(ci => ci.Index("test")
.AddMapping<Address>(m => m.MapFromAttributes())
.AddMapping<Person>(m => m.MapFromAttributes().SetParent<Address>()));
Index documents:
var bulkResponse = _client.Bulk(b => b
.Index<Address>(bd => bd.Object(new Address { Name = "Tel Aviv", Id = 1 }).Index("test"))
.Index<Person>(bd => bd.Index("test").Object(new Person {Id = 5, Address = 1, Name = "Me"}).Parent(1)));
And search by parent
var searchResponse = _client.Search<Person>(s => s
.Query(q=>q.MatchAll())
.Filter(q => q
.HasParent<Address>(c => c
.Query(cq => cq.Match(m=>m.OnField(t => t.Name).Query("Tel Aviv"))))));
I think the best place to look is at the NEST Unit Tests.
- Fluent Mapping Full Example Tests - Includes an example of setting Parent relationship.
- Has Parent Query
- Has Child Query
- Top Children Query
Also on the Nest Documentation Site there is a small snippet for running a has_child query. (Pretty much the same as the unit test)
来源:https://stackoverflow.com/questions/23949851/using-elasticsearch-net-nest-to-search-parent-documents-based-on-child-attribute