Найдите все документы, в которых поле типа double равно пустой строке

#elasticsearch

Вопрос:

Проблема

Я пытаюсь найти все документы, в которых для определенного поля задана пустая строка.

Но это поле относится к типу double , и это все усложняет…

Я не могу использовать term или match запрашивать, потому что поле имеет тип double . Я получаю number_format_exception .

В настоящее время я использую следующее:

 {
    "query": {
        "bool": {
            "must_not": [
                {
                   "exists": {
                        "field": "my_double_field"
                    }
                }
            ]
            
        }
    },
    "size": 100
}
 

Это возвращает все документы, где my_double_field равно "" , А документы, где my_double_field их вообще нет.

Вопрос

Есть ли запрос для возврата документов, если и только если для этого поля установлено значение "" ?

Комментарии:

1. Что вы хотите сделать, как только узнаете их?

2. @Val Я не совсем уверен, почему это имеет значение, но я полностью удалю поле, если оно равно "" .

3. Это имеет значение, смотрите мой ответ 😉

Ответ №1:

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

 POST test/_update_by_query
{
  "script": {
    "source": """
    if (ctx._source.my_double_field == '') {
      ctx._source.remove('my_double_field');
    }
    """,
    "lang": "painless"
  }
}
 

Комментарии:

1. Хорошо, спасибо за ответ. На самом деле это то, что я уже делаю. Мне просто было интересно, есть ли более быстрый способ. Приятно знать, что это не так!

2. Правильным способом было бы иметь ignore_malformed: false и coerce: false в вашем сопоставлении, чтобы убедиться, что документ отклонен.

3. Да, я как раз смотрел на это! Спасибо за информацию. Я буду обновлять сопоставления, как только удалю все эти строки. 🙂

4. Да, это работало, но на сканирование всего ушло несколько дней. Я обновил сопоставления, включив coerce в них и ignore_malformed . Затем сценарий начал давать сбои. Но хорошо то, что все идентификаторы с "" были зарегистрированы, так что теперь я могу обновлять их напрямую. Спасибо, что проверили!

5. Потрясающе, рад, что это помогло!