Ваш сценарий не работает, поскольку отображение поля будет иметь тип long
, и при выполнении поиска с использованием сценария, который вы написали, он смотрит только на инвертированный индекс типа long.
Вы можетеиспользуйте безболезненно скрипт для доступа к значениям документа и поиска всех строковых значений.Скрипт проверяет тип данных поля status
и возвращает true только для строкового типа.Следовательно, он вернет все документы, содержащие строковые значения.
PUT t1/doc/1
{
"status": 3
}
PUT t1/doc/2
{
"status": "3"
}
GET t1/_search
{
"query": {
"bool" : {
"filter" : {
"script" : {
"script" : {
"inline": "if(params._source.status instanceof String) return true;",
"lang": "painless"
}
}
}
}
}
}
Вывод:
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0,
"hits": [
{
"_index": "t1",
"_type": "doc",
"_id": "2",
"_score": 0,
"_source": {
"status": "3"
}
}
]
}
}
Дополнительная информация:
Если вы хотите измените все эти строковые значения на long , вы можете reindex
в новый индекс и использовать скрипт для манипулирования значениями.
//Create new index
PUT t2
//reindex from t1 to t2 and change string to integer
POST _reindex
{
"source": {
"index": "t1"
},
"dest": {
"index": "t2"
},
"script": {
"lang": "painless",
"inline": "if(ctx._source.status instanceof String){ctx._source.status = Integer.parseInt(ctx._source.status)}"
}
}