#elasticsearch
#elasticsearch
Вопрос:
В настоящее время у меня есть что-то вроде этого
aggs: {
categories: {
terms: {
field: 'category'
}
}
}
и это дает мне количество продуктов в каждой категории. Но у меня есть дополнительное условие. Мне нужно получить количество продуктов в каждой категории, которые еще не проданы, поэтому мне нужно terms
как-то выполнить фильтрацию.
Есть ли какой-нибудь элегантный способ сделать это с помощью aggregation framework, или мне нужно написать отфильтрованный запрос?
Спасибо
Ответ №1:
Вы можете объединить агрегацию терминов и агрегацию фильтров, и вот как это должно выглядеть: (проверено)
aggs: {
categories: {
filter: {term: {sold: true}},
aggs: {
names: {
terms: {field: 'category'}
}
}
}
}
Вы также можете добавить дополнительные условия к фильтру, надеюсь, это поможет.
Комментарии:
1. Вы случайно не знаете, как использовать два условия фильтра в одном и том же сегменте?
2. Я второй @g. вопрос лахлу. Как вы включаете несколько условий?
3. Мы можем использовать bool filter для всех терминов, например. «filter»: { «bool» : { «must» : [ {«term» : { «isActive» : «1» } }, {» термин» : { «isPrivate» : «0» } }, {«term» : { «isOwner» : «1» } } ] } }
4. Я обновляю свой вопрос, чтобы объяснить проблему
Ответ №2:
Просто чтобы добавить к другому ответу, вы также можете использовать вложенный запрос. Это похоже на то, что я должен был сделать. Я использую Elasticsearch 5.2.
Из документов, вот основной синтаксис:
"aggregations" : {
"<aggregation_name>" : {
"<aggregation_type>" : {
<aggregation_body>
}
[,"aggregations" : { [<sub_aggregation>] } ]?
}
[,"<aggregation_name_2>" : { ... } ]*
}
Вот как я это реализовал:
GET <path> core_data/_search
{
"aggs": {
"NAME": {
"nested": {
"path": "ATTRIBUTES"
},
"aggs": {
"NAME": {
"filter": {
"term": {
"ATTRIBUTES.ATTR_TYPE": "EDUCATION_DEGREE"
}
},
"aggs": {
"NAME": {
"terms": {
"field": "ATTRIBUTES.DESCRIPTION",
"size": 100
}
}
}
}
}
}
}
}
Это отфильтровало данные до одного сегмента, что мне и было нужно.