首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >全文搜索没有完全在rails上工作4 PG9.3

全文搜索没有完全在rails上工作4 PG9.3
EN

Stack Overflow用户
提问于 2014-10-31 15:45:41
回答 1查看 438关注 0票数 0

我对PG的搜索有问题。我有一个有两个列的表--名字和姓。我希望有人能够搜索一个人使用他们的名字,他们的姓,或全名。我当时正在追踪Railscast #343,搜索PG的全文。据我所知,搜索应该是按照我的意愿工作的,但它不起作用。下面的代码只会在您输入确切的名字或姓氏时才返回结果;它不会返回任何内容--您输入了名字和姓氏,或者只输入了名字或姓氏的一部分。

我希望能就如何使这项工作如我所愿提供任何意见。

模型

代码语言:javascript
复制
def self.text_search(query)
    if query.present?
      where("first_name @@ :q or last_name @@ :q", q: query)
    else
      where(nil)
    end
end

控制器

代码语言:javascript
复制
def index
   @members = @organization.members.text_search(params[:query]).page(params[:page]).per(20)
end

控制台输出

代码语言:javascript
复制
 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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-31 23:02:51

只是几个想法,什么可能会帮助你得到你想要的。

首先,在您的查询中,我认为您应该使用ILIKE来使搜索大小写不敏感,还应该对搜索项进行%包装,以便postgres知道要进行部分匹配。下面是我使用的自动完成jquery文本框中的一个示例。链接到PG文档

代码语言:javascript
复制
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

代码语言:javascript
复制
<%= search_form_for @q do |f| %>
 <%= f.label :first_name_or_last_name %>
  <%= f.search_field :first_name_or_last_name %>
  <%= f.submit %>
<% end %>

然后你的控制器就会很简单:

代码语言:javascript
复制
def index
  @q = Member.search(params[:q])
  @members = @q.result(distinct: true)
end

要搜索全名以及第一次和最后一次,我认为您必须在模型中创建一个名为full_name的字段,然后可以轻松地将其添加到搜索中。我不知道你怎么能不把它放在模型里。

希望这能帮上忙!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26678521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档