0

我在PG上搜索時遇到問題。我有一張有兩列名字和姓氏的表格。我希望有人能夠使用他們的名字,姓氏或全名搜索一個人。 我正在關注PG的全文搜索Railscast#343,並且據我所知,搜索應該按照我打算工作的方式工作,但事實並非如此。下面的代碼只會在您輸入確切的名字或姓氏時返回結果;它不會返回任何東西,你把名字和姓氏,或者如果你只把名字或姓氏的一部分。全文檢索不能在rails上完全運行4 PG 9.3

我將不勝感激任何關於如何使這項工作的意見。

型號

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

剛上什麼可能幫助你,你在找什麼一對夫婦的想法。

首先,在您的查詢中,我相信您應該使用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 

第二個建議,我會做是使用搜查,這樣就可以同時搜索多個領域使用相同的搜索框。例如,如果你使用搜查,你可以這樣做以下: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的字段,然後你可以很容易地將它添加到搜索中。我不確定在模型中沒有真正存在的情況下你能做到這一點。

希望有幫助!

+1

感謝您的幫助!我在使用PG時無法使用「%」的印象。給出我可以這樣的事實,我做出了迄今爲止工作的聲明:where(「first_name ILIKE?OR last_name ILIKE?OR first_name ||''|| last_name ILIKE?」,「%#{query}%」,「 %#{query}%「,」%#{query}%「)' – DJF 2014-11-01 17:54:14