# Найти поля содержащие пустую строку и удалить

**URL:** <https://discuss.elastic.co/t/topic/201239>\
**Category:** Вопросы на русском языке\
**Created:** [September 26, 2019, 1:07pm UTC](https://discuss.elastic.co/t/topic/201239 "2019-09-26T13:07:28Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [September 26, 2019, 1:07pm UTC](https://discuss.elastic.co/t/topic/201239/1 "2019-09-26T13:07:28Z")

</div>

Собственно subj. Хочу найти документы в которые поле пустое и удалить его совсем.

1. Вариант:

```auto
{
  "query": { 
    "nested":{
      "path":"body2",
      "query":{
        "bool": { 
          "filter": { 
          "exists":{"field":"body2.txt"} 
          }, 
          "must_not": { 
            "wildcard": { "body2.txt": "*" } 
          }
        }
      }
    }
  }
}

```

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

1. Вариант reindex со скриптом - сделать можно, что угодно, но очень долго.

Пытался еще сделать через update со сриптом, но ES ругается , что поле текстовое и нет FieldData.

Есть еще варианты?

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [September 26, 2019, 2:27pm UTC](https://discuss.elastic.co/t/topic/201239/2 "2019-09-26T14:27:32Z")

</div>

С точки зрения индекса строка состоящая из сплошных шумовых слов и пустая строка - это одно и то же. Поэтому если это поле еще как-то не проиндексировано, но в индексе информации об этом отличии просто нет. Это значит, что нам в любом случае получать source для записей с пустыми шумовыми словами и проверять ее. То есть как-то так:

```auto
DELETE test

PUT test
{
  "mappings": {
    "properties": {
      "text": {
        "type": "text",
        "analyzer": "english"
      }
    }
  }
}

PUT test/_doc/only_stop_words
{
  "text": "to be or not to be"
}

PUT test/_doc/not_empty
{
  "text": "that is the question"
}

PUT test/_doc/empty
{
  "text": ""
}

PUT test/_doc/null
{
  "text": null
}

PUT test/_doc/does_not_exist
{

}

POST test/_update_by_query
{
  "script": {
    "source": """
      if(ctx._source.text.length() > 0) {
        ctx.op = "noop"
      } else {
        ctx._source.remove('text')
      }
      
      """,
    "lang": "painless"
  },
  "query": {
    "bool": {
      "filter": {
        "exists": {
          "field": "text"
        }
      },
      "must_not": {
        "wildcard": {
          "text": "*"
        }
      }
    }
  }
}

POST test/_search

```

---

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [September 27, 2019, 6:28am UTC](https://discuss.elastic.co/t/topic/201239/3 "2019-09-27T06:28:25Z")

</div>

Да, в общем то логично, что если поле не проиндексировано надо работать на уровне \_source. 🙂  
Примерно так и сработало, правда не с первого раза.  
Запрос якобы что-то делал, но при проверке все документы остались такими же как есть.

```auto
{
  "took" : 1204280,
  "timed_out" : false,
  "total" : 2033165,
  "updated" : 1934233,
  "deleted" : 0,
  "batches" : 2034,
  "version_conflicts" : 0,
  "noops" : 98932,
  "retries" : {
    "bulk" : 0,
    "search" : 0
  },
  "throttled_millis" : 0,
  "requests_per_second" : -1.0,
  "throttled_until_millis" : 0,
  "failures" : []
}

```

Видимо у меня нюанс в nested. Я удалил весь nested т.к. в этом случае он весь ненужен.

```auto
{ 
  "script": { 
    "source": "if(ctx._source.body2.txt.length() > 0) { ctx.op = \"noop\" } else { ctx._source.remove('body2') } ",
    "lang": "painless"
  },
  "query": { 
    "nested":{ 
      "path":"body2", 
      "query":{ 
        "bool": { 
          "filter": { 
            "exists":{"field":"body2.txt"} 
          }, 
          "must_not": { 
            "wildcard": { "body2.txt": "*" } 
          } 
        } 
      } 
    } 
  } 
}

```

Спасибо!

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [October 25, 2019, 6:28am UTC](https://discuss.elastic.co/t/topic/201239/4 "2019-10-25T06:28:25Z")

</div>

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
