Существует еще один более оптимальный вариант для достижения именно того, что вы хотите. Вы можете использовать конвейеры API ingest , а с помощью script
процессора вы можете создать другое числовое поле во время индексации, которое затем можно будет использовать более эффективно во время поиска.
Приведенный ниже конвейер приема содержит один script
процессор, который создаст другое поле с именем numField
, которое будет содержать только числовые значения.
POST _ingest/pipeline/_simulate
{
"pipeline": {
"processors": [
{
"script": {
"source": """
ctx.numField = /\D/.matcher(ctx.testField).replaceAll("");
"""
}
}
]
},
"docs": [
{
"_source": {
"testField": "123"
}
},
{
"_source": {
"testField": "abc123"
}
},
{
"_source": {
"testField": "123abc"
}
},
{
"_source": {
"testField": "abc"
}
}
]
}
Симуляция этого конвейера с 4 различными документами, имеющими сочетание буквенно-цифрового содержимого, даст следующее:
{
"docs" : [
{
"doc" : {
"_index" : "_index",
"_type" : "_type",
"_id" : "_id",
"_source" : {
"numField" : "123",
"testField" : "123"
},
"_ingest" : {
"timestamp" : "2019-05-09T04:14:51.448Z"
}
}
},
{
"doc" : {
"_index" : "_index",
"_type" : "_type",
"_id" : "_id",
"_source" : {
"numField" : "123",
"testField" : "abc123"
},
"_ingest" : {
"timestamp" : "2019-05-09T04:14:51.448Z"
}
}
},
{
"doc" : {
"_index" : "_index",
"_type" : "_type",
"_id" : "_id",
"_source" : {
"numField" : "123",
"testField" : "123abc"
},
"_ingest" : {
"timestamp" : "2019-05-09T04:14:51.448Z"
}
}
},
{
"doc" : {
"_index" : "_index",
"_type" : "_type",
"_id" : "_id",
"_source" : {
"numField" : "",
"testField" : "abc"
},
"_ingest" : {
"timestamp" : "2019-05-09T04:14:51.448Z"
}
}
}
]
}
После индексации документов с использованием этого конвейера вы можете выполнить запрос диапазона на numField
вместо testField
. По сравнению с другим решением (извините, @Kamal), оно перекладывает бремя сценариев для выполнения только один раз для каждого документа во время индексации, а не каждый раз для каждого документа во время поиска.
{
"query": {
"range": {
"numField": {
"gte": 0,
"lte": 2000000
}
}
}
}