#elasticsearch
#elasticsearch
Вопрос:
У меня есть индекс в эластичном поиске, в большинстве записей есть поле foo
, в некоторых может и не быть.
Я хочу знать, есть ли у всех записей поле foo
, выполнив агрегацию.
случай 1:
id = 0, foo = 1, bar = 1
выполнение такой агрегации дало бы мне fooContainsNull = false
, потому что все записи содержат foo
случай2:
id = 0, foo = 1, bar = 1
id = 1, bar = 1
выполнение такой агрегации дало бы мне fooContainsNull = true
, потому что одна из записей (id = 1) не имеет foo
Я попытался использовать агрегацию фильтров
"aggregations": {
"fooContainsNull": {
"filter": {
"bool": {
"not": {
"exists": {
"field": "foo"
}
}
}
}
}
}
но bool
и not
, похоже, не могут использоваться вместе.
Как я могу добиться этого с помощью агрегации эластичного поиска?
Ответ №1:
Заменить not
на must_not
,
"aggregations": {
"fooContainsNull": {
"filter": {
"bool": {
"must_not": {
"exists": {
"field": "foo"
}
}
}
}
}
}
Это даст вам количество документов, для которых нет поля foo
fooContainsNull
. Соответственно, вы можете построить логику, проверив, что это число равно 0 или больше 0.
Ответ №2:
или даже лучше
aggs: {
aggregationName: {
missing: {
field: 'fieldName'
}
}
}
Комментарии:
1. Почему это еще лучше?
2. @JeremyCaney потому что оно чище