Использование пропущенной агрегации для термина в отличие от поля - PullRequest
0 голосов
/ 11 октября 2019

Я надеюсь, что это правильное место, чтобы спросить это. Я пытаюсь получить совокупность элементов, которые не содержат определенного поля. Это элементы с вложенным полем, как показано ниже:

             "customFields": [
                 {
                     "key": "firstType",
                     "keywordValue": "1"
                 },
                 {
                     "key": "secondType",
                     "keywordValue": "A"
                 }
             ]

Я пытался использовать отсутствующую агрегацию, если я пытался найти все элементы, которые не содержат ключ, с помощьюЗначение firstType, но не повезло. Я сделал следующий запрос:

 "aggregations": {
       "custom.firstType": {
               "missing": {
                 "field": "firstType"
               },
               "aggregations": {
                 "values": {
                   "reverse_nested": {}
                 }
               }
             }
           }

К сожалению, мне не повезло. Что я смотрю?

Спасибо!

1 Ответ

0 голосов
/ 11 октября 2019

Пропущенная агрегация используется для поиска документов, которые не содержат заданное поле (не значение)

{
   "product_id": "p1",
   "price":100
}
{
   "product_id":"P2"
}

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

В вашем случае вы хотите агрегировать документы, которые не имеют определенного значения, вам нужно использовать вложенную агрегацию с фильтром субагрегации

Отображения:

PUT index19
{
  "mappings": {
    "properties": {
      "customFields": {
        "type": "nested",
        "properties": {
          "key": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword"
              }
            }
          },
          "keywordValue":{
            "type":"integer"
          }
        }
      }
    }
  }
}

Запрос:

GET index19/_search
{
  "size": 0,
  "aggs": {
    "without_firsttype": {
      "nested": {
        "path": "customFields"
      },
      "aggs": {
        "key_check": {
          "filter": {
            "bool": {
              "must_not": [
                {
                  "term": {
                    "customFields.key.keyword": {
                      "value": "firstType"
                    }
                  }
                }
              ]
            }
          },
          "aggs": {
            "Document": {
              "reverse_nested": {}
            }
          }
        }
      }
    }
  }
}

Результат:

"aggregations" : {
    "without_firsttype" : {
      "doc_count" : 4,
      "key_check" : {
        "doc_count" : 3,
        "Document" : {
          "doc_count" : 2
        }
      }
   }
}
...