#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. Потрясающе, рад, что это помогло!