Как игнорировать вложенные объекты, которые имеют нулевое значение или не существуют - PullRequest
0 голосов
/ 10 марта 2020

У меня запрос агрегации ниже.

{
    "aggs": {
        "selected_brand": {
            "filter": {
                "term": {
                    "brandId": "b1d28821-3730-4266-8f55-eb69596004fb"
                }
            }
        },
        "sponsorshipSets": {
            "nested": {
                "path": "sponsorshipSets"
            },
            "aggs": {
                "sponsorships": {
                    "nested": {
                        "path": "sponsorshipSets.sponsorships"
                    },
                    "aggs": {
                        "count": {
                            "value_count": {
                                "field": "sponsorshipSets.sponsorships.id"
                            }
                        }
                    }
                }
            }
        }
    }
}

Ответ ниже.

{
  "hits": {
    "total": {
      "value": 2980,
      "relation": "eq"
    }
  },
  "aggregations": {
    "selected_brand": {
      "doc_count": 314
    },
    "sponsorshipSets": {
      "doc_count": 2635,
      "sponsorships": {
        "doc_count": 1076,
        "count": {
          "value": 1076
        }
      }
    }
  }
}

В ответе показано, что количество спонсорских документов составляет 1076, теперь я хочу получить документы эти документы и пробовал по следующему запросу.

{
    "query": {
        "bool": {
            "must": {
                "nested": {
                    "path": "sponsorshipSets",
                    "query": {
                        "nested": {
                            "path": "sponsorshipSets.sponsorships",
                            "query": {
                                "bool": {
                                    "must_not": [
                                        {
                                            "match": {
                                                "sponsorshipSets.sponsorships": "null"
                                            }
                                        }
                                    ]
                                }
                            }
                        }
                    }
                }
            },
            "filter": [
                {
                    "term": {
                        "brandId": "b1d28821-3730-4266-8f55-eb69596004fb"
                    }
                }
            ]
        }
    }
}

Интересно, что для второго запроса ниже только 82.

"hits": {
    "total": {
      "value": 82,
      "relation": "eq"
    },

Что я действительно хочу, так это получить количество всех документов спонсорских наборов, которые не являются нулевыми или не существуют. Спонсорские наборы также могут отсутствовать.

Найти под сокращенным шаблоном.

{
  "index_patterns": "campaigns*",
  "order": 4,
  "version": 4,
  "aliases": {
    "campaigns": {

    }
  },
  "settings": {
    "number_of_shards": 5
  },
  "mappings": {
    "dynamic": "false",
    "properties": {
      "brandId": {
        "type": "keyword"
      },
      "sponsorshipSets": {
        "type": "nested",
        "properties": {
          "id": {
            "type": "keyword"
          },
          "sponsorships": {
            "type": "nested",
            "properties": {
              "id": {
                "type": "keyword"
              }
            }
          }
        }
      }
    }

1 Ответ

2 голосов
/ 11 марта 2020

Вы можете использовать exists запрос для фильтрации таких документов. Ниже запрос должен помочь.

Запрос:

POST <your_index_name>/_search
{
   "query":{
      "bool":{
         "must":{
            "nested":{
               "path":"sponsorshipSets",
               "query":{
                  "nested":{
                     "path":"sponsorshipSets.sponsorships",
                     "query":{
                        "bool":{
                           "must_not":[
                              {
                                 "exists":{
                                    "field":"sponsorshipSets.sponsorships"
                                 }
                              }
                           ]
                        }
                     }
                  }
               }
            }
         },
         "filter":[
            {
               "term":{
                  "brandId":"b1d28821-3730-4266-8f55-eb69596004fb"
               }
            }
         ]
      }
   }
}

Это должно вернуть все три сценария ios, где структура вашего документа JSON будет

  • sponsorshipSets.sponsorships: {} т.е. у вас есть пустая структура для sponsorships

  • sponsorshipSets.sponsorships: null т.е. значение установлено как null

  • Или ваш документ не На первом месте нет поля sponsorships.

Вам не нужно использовать какие-либо агрегации для этого, так как ES вернет вам количество таких документов в hits.total.value ответа.

Дайте мне знать, если это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...