Нижняя функция пользователя, где условие в searchkick
@ankane Как я могу использовать нижнюю функцию postgres в условиях поиска где?
У меня есть запрос ниже, который работает нормально
klass.search(@params[:query], fields: [:name,:category_name],where: {or: [[{available_cities_name: "New Yo"},{available_cities_short_name: "NY"}]]}).hits
Теперь я хочу использовать более низкую функцию, но я получаю синтаксическую ошибку
klass.search(@params[:query],
fields: [:name,:category_name],
where: {
or: [ [
{"lower(available_cities_name) = ?", "New Yo"},
{"lower(available_cities_short_name) = ?", "ny"}
]]
}
).hits
Я получаю ниже синтаксической ошибки,
SyntaxError: неожиданное '}', ожидание конца ввода e_cities_name) =?", "New Yo"},{"lower(available_cities_shor)
Может кто-нибудь сказать мне, как использовать нижнюю функцию в searchkick?
2 ответа
Elasticsearch не имеет lower
функция. Чтобы обойти это, вы можете проиндексировать строчную версию поля и выполнить запрос.
def search_data
{
available_cities_name: available_cities_name,
available_cities_name_lower: available_cities_name.downcase
}
end
Есть два способа передать аргументы в часть вашего запроса. Первый - использовать хэш-синтаксис, например: {arg_name: 'expected_value'}
а второй массив-синтаксис: ["arg_name = ?", 'expected_value']
Ваша ошибка в том, что вы используете синтаксис массива, но пытаетесь передать его как хеш. то есть: {"arg_name = ?", 'expected_value'}
который является неверным синтаксисом.
Вместо этого попробуйте:
klass.search(@params[:query],
fields: [:name,:category_name],
where: {
or: [
["lower(available_cities_name) = ?", "New Yo"],
["lower(available_cities_short_name) = ?", "ny"]
]
}
).hits
или даже просто:
klass.search(@params[:query],
fields: [:name,:category_name],
where: ["lower(available_cities_name) = ? OR lower(available_cities_short_name) = ?", "New Yo", "ny"]
).hits
(Примечание: весь код должен быть проверен на ошибки перед запуском).