我对PG的搜索有问题。我有一个有两个列的表--名字和姓。我希望有人能够搜索一个人使用他们的名字,他们的姓,或全名。我当时正在追踪Railscast #343,搜索PG的全文。据我所知,搜索应该是按照我的意愿工作的,但它不起作用。下面的代码只会在您输入确切的名字或姓氏时才返回结果;它不会返回任何内容--您输入了名字和姓氏,或者只输入了名字或姓氏的一部分。
我希望能就如何使这项工作如我所愿提供任何意见。
模型
def self.text_search(query)
if query.present?
where("first_name @@ :q or last_name @@ :q", q: query)
else
where(nil)
end
end控制器
def index
@members = @organization.members.text_search(params[:query]).page(params[:page]).per(20)
end控制台输出
SELECT COUNT(count_column) FROM (SELECT 1 AS count_column FROM "members" WHERE "members"."organization_id" = $1 AND (first_name @@ 'jon' or last_name @@ 'jon') AND (expiration_date <= '2014-11-30') AND (expiration_date > '2014-10-31') LIMIT 20 OFFSET 0)发布于 2014-10-31 23:02:51
只是几个想法,什么可能会帮助你得到你想要的。
首先,在您的查询中,我认为您应该使用ILIKE来使搜索大小写不敏感,还应该对搜索项进行%包装,以便postgres知道要进行部分匹配。下面是我使用的自动完成jquery文本框中的一个示例。链接到PG文档
def users
search_term = params[:term]
@users = current_account.users.where("name ILIKE ?", "%#{search_term}%").order(name: :asc)
respond_to do |format|
format.json { @users }
end
end我要提出的第二个建议是使用Ransack,这样您就可以使用相同的搜索框同时搜索多个字段。例如,如果您使用的是Ransack,您可以执行如下操作:链接到Github上的Ransack
<%= search_form_for @q do |f| %>
<%= f.label :first_name_or_last_name %>
<%= f.search_field :first_name_or_last_name %>
<%= f.submit %>
<% end %>然后你的控制器就会很简单:
def index
@q = Member.search(params[:q])
@members = @q.result(distinct: true)
end要搜索全名以及第一次和最后一次,我认为您必须在模型中创建一个名为full_name的字段,然后可以轻松地将其添加到搜索中。我不知道你怎么能不把它放在模型里。
希望这能帮上忙!
https://stackoverflow.com/questions/26678521
复制相似问题