We have cities where each has some sporting places, and some places are present in multiple cities:
London: Multiplex, Fivestar
Berlin: Multiplex, Bestgym
Paris: Multiplex, Bestgym, Fivestar
We have places where each place has some content to offer. For example:
Bestgym: gym, bar
Fivestar: water pool, bar
Multiplex: gym, bar, football, table tennis
In the field contents we store an integer which represents a combination of different flags which we resolve with a bitwise operator (a good read on this approach here: How we built a reversible recommendation system using Elasticsearch). For example:
1: gym
2: bar
4: football
8: table tennis
16: water pool
Following this logic, on document level for each place we store a number:
placeA: 3 (1+2)
placeB: 18 (16+2)
placeC: 15 (1+2+4+8)
Using bitwise operaton we can easily resolve which contents each place has. We can even easily filter out which cities have a certain content. For example, if we wanted all places in a specific city which contain gym, bar and football (1+2+4=7), it would look like this:
"query": {
"constant_score": {
"filter": {
"bool": {
"must": [
{
"match": {
"city": "London"
}
},
{
"script": {
"script": {
"lang": "expression",
"source": "7 & doc['contents'].value"
}
}
}
]
}
}
}
}
The Problem:
We want to get all contents a city has to offer. If I were to do a simple aggregation on top of the upper query, it would return all possible permutations of flag sums, e.g.:
1,2,3,7,14,15,18,28,31
What I want is, get bucket results which represent the flag number of the contents, e.g.
2,4,16
Any ideas how this would be achievable?