Reputation: 154
I have a filter query with 3 filters: "query": "iphone", color:5, category:10, brand:25
.
How can I get the number of products in each brand which has color:5
and category:10
?
In Solr I did it like:
fq={!tag=tag_facet_brand}facet_brand:"564"&facet.field={!ex=tag_facet_brand}facet_brand
How can I exclude 1 filter from the aggregation context? (I can't use global, because I lose query:iphone
, and I can't use post_filter - because of performance).
Upvotes: 8
Views: 4211
Reputation: 3504
In addition to @Lionel Sengkouvanh answer, here's the equivalent with the java API:
SearchRequestBuilder request = client
.prepareSearch(INDEX_NAME)
.setQuery(theQuery)
...
.addAggregation(
AggregationBuilders.global("all").subAggregation(
AggregationBuilders.filter("keyword").filter(filter).subAggregation(
AggregationBuilders.terms("brand").field("brand")
)
)
);
Upvotes: 2
Reputation: 126
We are just moving from SOLR and we are facing the same issue.
You could try global bucket then add a query filter for each bucket :
"filter" : {
"query" : {
"query_string" : {
"query" : "iPhone"
}
}
}
You should end with something like :
{
"size": 10,
"query": {
"query_string": {
"query": "iphone"
}
},
"filter": {
"bool": {
"must": [
{
"term": {
"brand": "564"
}
},
{
"term": {
"color": "5"
}
},
{
"term": {
"category": "10"
}
}
]
}
},
"aggs": {
"all": {
"global": {},
"aggs": {
"keyword": {
"filter": {
"bool": {
"must": [
{
"query": {
"query_string": {
"query": "iphone"
}
}
},
{
"term": {
"color": "5"
}
},
{
"term": {
"category": "10"
}
}
]
}
},
"aggs": {
"brand": {
"terms": {
"field": "brand"
}
}
}
}
}
}
}
}
Upvotes: 9