Как получить пустые поля в elasticsearch? - PullRequest
3 голосов
/ 27 мая 2020

Когда я делаю этот запрос, я могу получить сопоставления индекса:

GET /users

И он возвращает следующее:

{
   "user":{
      "mappings":{
         "skill":{
            "properties":{
               ...
               "Rouge":{
                  "type":"float"
               },
               "Ruby":{
                  "type":"float"
               },
               "Rust":{
                  "type":"float"
               },
               "SAS":{
                  "type":"float"
               },
               "SASS":{
                  "type":"float"
               },
               "SCSS":{
                  "type":"float"
               },
               ...
               "settings":{
                  "index":{
                     "creation_date":"1584415338201",
                     "number_of_shards":"5",
                     "number_of_replicas":"0",
                     "provided_name":"user"
                  }
               }
            }
         }
      }
   }
}

Проблема в том, что некоторые поля пусты и я хочу их найти.

Например, ни у кого нет значения для Ruby. Если я могу специально искать поле, чтобы увидеть, пусто ли оно / ноль, я могу это сделать, но мне нужен запрос, чтобы найти все пустые поля, которые, к сожалению, я не смог найти в Интернете.

Конечно, я могу получить все поля и запустить запрос проверки на пустоту для всех из них, но, вероятно, это плохая идея. Знаете, как это лучше сделать?

Я использую версию 6.8.

1 Ответ

1 голос
/ 28 мая 2020

Я думаю, вы можете использовать aggregations для этого, я знаю, что это непростое решение и вам нужно написать все имена полей; но это может быть полезно.

GET users/_search
{
  "size": 0,
  "aggs": {
    "Rouge": {
      "value_count": {
        "field": "Rouge"
      }
    },
    "Ruby": {
      "value_count": {
        "field": "Ruby"
      }
    },
    "Rust": {
      "value_count": {
        "field": "Rust"
      }
    },
    "SAS": {
      "value_count": {
        "field": "SAS"
      }
    },
    "SASS": {
      "value_count": {
        "field": "SASS"
      }
    },
    "SCSS": {
      "value_count": {
        "field": "SCSS"
      }
    }
  }
}

Если один из них не имеет значения, он будет отображаться как "value": 0, например:

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "Ruby": {
      "value": 0
    }
  }
}
...