То, что вы ищете, может быть достигнуто с помощью скрипта painless
.Вы можете прочитать больше о них здесь .
Я создал образец индекса с отображением, имеющим поля name
и postcode
.
Созданный мной query
будет перечислять людей с именем John
, которые находятся в области postcode
, имеющей postcode
больше 30500
Отображение:
{
"testindex": {
"mappings": {
"mydocuments": {
"properties": {
"name": {
"type": "text"
},
"postcode": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
}
Образцы документов
POST testindex/mydocuments/1
{
"postcode": "30005",
"name": "John"
}
POST testindex/mydocuments/2
{
"postcode": "31000",
"name": "John Doe"
}
POST testindex/mydocuments/3
{
"postcode": "32000",
"name": "John Wright"
}
Запрос с использованием безболезненных сценариев
В приведенном ниже запросе вы можете использовать postcode
вместо postcode.keyword
, однако вам необходимо установить "fieldata": true
для postcode
, который имеет тип text.
POST testindex/_search
{
"query": {
"bool": {
"must": {
"match": {
"name": "john"
}
},
"filter": {
"bool" : {
"must" : {
"script" : {
"script" : {
"inline" : "Integer.parseInt(doc['postcode.keyword'].value) > params.param1",
"lang" : "painless",
"params" : {
"param1" : 30500
}
}
}
}
}
}
}
}
}
То, что делает вышеприведенный query
, просто преобразовывает text
в integer
во время выполнения запроса и таким образом вычисляет логику фильтра,
Обратите внимание, что для каждого документа он будет анализировать текст в Integer и, таким образом, выполнять запрос.Совершенно очевидно, что производительность запросов значительно снизилась бы, если бы у вас в конечном итоге были миллионы документов.
Я бы посоветовал вам изменить отображение почтового индекса, имеющего тип integer
, и соответственно выполнить функцию фильтрации.Однако, если у вас нет выбора и / или использования сторонних данных, я надеюсь, что вышеуказанного запроса будет достаточно.