searchkick 中 where 条件下的用户下层函数

User Lower Function in where condition in searchkick

@ankane 我如何在 searchkick 的 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 '}', expecting end-of-input e_cities_name) = ?", "New Yo"},{"lower(available_cities_shor

谁能告诉我如何在 searchkick 中使用较低的功能?

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

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

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

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