Hello,

I just started using ElasticSearch 1.0.1. I am trying to find the ideal 
data model and query for my exact needs, which I will explain below (I 
changed just the terms of the data model corresponding to my real use case, 
in order to see if I was able to formulate it differently, which was 
useful).

I am indexing documents corresponding to BookedStay. A BookedStay has a 
nested array (named places) containing map objects corresponding to visited 
places during the stay. An object has an id (place id) and a category 
corresponding to the time of day of the visited place. A BookedStay then 
has a second nested array, corresponding to the amenities used during the 
stay. The objects in the array have an id (of type string) and a count.

So a BookedStay can be represented as : {"date": 03/03/2014, 
"placesVisited": [{"id": 3, "category": "MORNING"}, {"id": 5, 
"category":  "AFTERNOON"}, {"id": 7, "category": "EVENING"}], "amenities": 
[{"amenityId": "restaurant", "count": 3}, {"amenityId": "dvdPlayer", 
"count": 1}] }

What I want to run is a query over a given room number, and find for 
all BookedStay that have this given place number in their places array, an 
aggregate over all amenities used, per time of day.

This amounts to finding, for all documents that have a place id of (for 
instance) 5, the number of times the restaurant was used, or the dvd player 
in the lounge, broken down by time of day. The ultimate goal is to 
understand better how the visit of a place in a given time of day affects 
the services sold by the hotel.

I am unable to achieve this query, as when I run a first nested aggregate 
over the category, I cannot nest the second one over the amenities as it is 
in the "parent" document. Is it possible to do that? In that case, how do I 
specify that the nested aggregation will take place over the parent object 
of the current aggregation?

Here is a tentative query with the Java driver (obviously not working, 
because of the above problem):

SearchRequestBuilder srb = 
elasticSearchService.getClient().prepareSearch("test_index").setSearchType(SearchType.COUNT).setTypes("test_stay").setQuery(QueryBuilders.nestedQuery("placesVisited",
 
QueryBuilders.termQuery("id", 5)))
.addAggregation(AggregationBuilders.nested("nestedPlaceVisited").path("placesVisited")
.subAggregation(AggregationBuilders.filter("currentPlaceFilter").filter(FilterBuilders.termFilter("id",
 
5))
.subAggregation(AggregationBuilders.terms("countPerTimeCategory").field("category")
.subAggregation(AggregationBuilders.nested("nestedAmenities").path("amenities") 
 // HERE THIS subaggregation should run over the original document... and I 
dont know how to achieve that
 
subAggregation(AggregationBuilders.terms("amenitiesUsed").field("amenities.amenityId"))

Thanks for your help over this difficult problem! If it's not possible with 
"parent aggregations", how should I refactor my data model?

Jean-Noel

-- 
You received this message because you are subscribed to the Google Groups 
"elasticsearch" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elasticsearch/e8a752fc-0a96-437d-b071-4009c0f39d33%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to