Неподходит тем, что если поле например содержит только стоп-слова оно сюда попадет. Но при следующей переиндексации и другом мапипинге какие то слова могут оказаться нужными.
Вариант reindex со скриптом - сделать можно, что угодно, но очень долго.
Пытался еще сделать через update со сриптом, но ES ругается , что поле текстовое и нет FieldData.
С точки зрения индекса строка состоящая из сплошных шумовых слов и пустая строка - это одно и то же. Поэтому если это поле еще как-то не проиндексировано, но в индексе информации об этом отличии просто нет. Это значит, что нам в любом случае получать 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
Да, в общем то логично, что если поле не проиндексировано надо работать на уровне _source.
Примерно так и сработало, правда не с первого раза.
Запрос якобы что-то делал, но при проверке все документы остались такими же как есть.
Apache, Apache Lucene, Apache Hadoop, Hadoop, HDFS and the yellow elephant
logo are trademarks of the
Apache Software Foundation
in the United States and/or other countries.