Агрегирование эластичного поиска позволяет определить, существует ли поле во всех записях

#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 потому что оно чище