用户较低的功能在searchkick中的条件

时间:2018-01-22 05:17:00

标签: ruby-on-rails elasticsearch ruby-on-rails-5 searchkick

@ankane 如何在searchkick的where where

中使用postgres lower函数

我在下面查询哪个工作正常

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:unexpected'}',期待输入结束   e_cities_name)=?“,”New Yo“},{”lower(available_cities_shor

有人可以告诉我如何在searchkick中使用较低的功能吗?

2 个答案:

答案 0 :(得分:1)

Elasticsearch没有lower函数。要解决此问题,您可以为该字段的小写版本建立索引并对其进行查询。

def search_data
  {
    available_cities_name: available_cities_name,
    available_cities_name_lower: available_cities_name.downcase
  }
end

答案 1 :(得分:0)

将args传递给部分查询有两种方法。第一种是使用哈希语法,例如:{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

(注意:所有代码都需要在运行之前进行错误测试)。