【问题标题】:Full text search not working completely on rails 4 PG 9.3全文搜索无法在 rails 4 PG 9.3 上完全运行
【发布时间】:2014-10-31 15:45:41
【问题描述】:

我在 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)

【问题讨论】:

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


    【解决方案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 的字段,然后您可以轻松地将其添加到搜索中。我不确定如果它实际上不在模型中,你还能怎么做。

    希望有帮助!

    【讨论】:

    • 感谢您的帮助!我的印象是在使用 PG 时无法使用“%”。鉴于我可以,我发表了目前有效的声明where("first_name ILIKE ? OR last_name ILIKE ? OR first_name ||' '|| last_name ILIKE ?", "%#{query}%", "%#{query}%", "%#{query}%")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    • 2016-12-14
    • 2017-10-09
    • 1970-01-01
    相关资源
    最近更新 更多