WedX - журнал о программировании и компьютерных науках

Пользовательская нижняя функция, где условие в searchkick

@ankane Как я могу использовать нижнюю функцию postgres в условии searchkick's where

У меня есть запрос ниже, который работает нормально

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?


Ответы:


1

В Elasticsearch нет функции lower. Чтобы обойти это, вы можете проиндексировать версию поля в нижнем регистре и запросить ее.

def search_data
  {
    available_cities_name: available_cities_name,
    available_cities_name_lower: available_cities_name.downcase
  }
end
09.08.2018
  • Принимаю ваш ответ, не проверяя его, потому что я знаю, что вы гений :) 09.08.2018

  • 2

    Есть два способа передать аргументы в часть вашего запроса. Первый — использовать хэш-синтаксис, например: {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
    

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

    22.01.2018
  • позвольте мне попробовать ваше решение 22.01.2018
  • Да, ты прав. я использовал синтаксис массива. но я думаю, что это не работает должным образом. так как у меня есть city_name = New York и city short name = ny, но когда я пробую этот запрос, он дает мне тот же результат klass.search(@params[:query],fields: [:name,:category_name],where: ["lower(available_cities_name) = ? OR lower(available_cities_short_name) = ?", "vzxzjx", "czbchjzx"]).hits, вместо этого он не должен приводить ни к какому продукту 22.01.2018
  • те же результаты для этого запроса также klass.search(@params[:query],fields: [:name,:category_name],where: ["lower(available_cities_name) = ? OR lower(available_cities_short_name) = ?", "", ""]).hits 22.01.2018
  • Вы преодолели синтаксическую ошибку, верно? эту другую вещь, которую вы пытаетесь втиснуть в комментарии, вероятно, лучше всего написать как новый вопрос;) 23.01.2018
  • Да. Спасибо за ваше предложение. Я решил проблему со своей стороны. поэтому не нужно создавать новый вопрос. спасибо за ваше время и ответ :) 23.01.2018
  • Вы разрешили синтаксис, но это того не стоит, потому что запрос неверен, и я не получил правильный результат, который я хочу. я могу принять и проголосовать за это. но это введет в заблуждение других пользователей, думая, что этот запрос правильный. извини !!! 23.01.2018
  • Это решило настоящую проблему, с которой вы столкнулись и о которой вы просили помочь. если вы затем решили другую проблему в том же коде... это другой вопрос. с другим ответом. 23.01.2018
  • Может кто-нибудь сказать мне, как использовать более низкую функцию в searchkick? это мой вопрос, проверьте его. и до сих пор не знаю как им пользоваться 23.01.2018
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]