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