@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中使用较低的功能吗?
答案 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
(注意:所有代码都需要在运行之前进行错误测试)。