Нижняя функция пользователя, где условие в 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

(Примечание: весь код должен быть проверен на ошибки перед запуском).

Другие вопросы по тегам