全文搜索无法完全在rails 4 PG 9.3上运行

时间:2014-10-31 15:45:42

标签: postgresql search ruby-on-rails-4 full-text-search railscasts

我在搜索PG时遇到问题。我有一个表有两列第一名和姓。我希望有人能够使用他们的名字,姓氏或全名来搜索一个人。 我正在关注全球搜索PG的Railscast#343,据我所知,搜索应该可行,因为我打算工作,但它没有。下面的代码只会在您输入确切的名字或姓氏时返回结果;它不会返回任何内容,如果您输入名字和姓氏,或者您只是放置名字或姓氏的一部分。

如果我打算如何使这项工作,我将不胜感激。

模型

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)

1 个答案:

答案 0 :(得分:1)

关于什么可能有助于您获得所需内容的几点想法。

首先,在您的查询中,我相信您应该使用ILIKE来使搜索字符串不敏感,并且%%包围您的搜索字词,以便postgres知道进行部分匹配。这是我使用的自动完成jquery文本框中的示例。 Link to the PG Documentation

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,则可以执行以下操作:Link to Ransack on Github

<%= 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的字段,然后您可以轻松地将其添加到搜索中。我不确定如果没有实际存在于模型中,你还能做到这一点。

希望有所帮助!