多文本搜索问题

时间:2013-10-04 16:08:09

标签: ruby-on-rails ruby ruby-on-rails-2

我创建了一个使用2列(名称和姓氏)的搜索应用程序,但是当一个人拥有2个以上的名字时,它不起作用。如何搜索具有3个姓名和姓氏的人?

控制器:

class PersonController < ApplicationController

 def search

  @people = Person.find(:all,:conditions=>["(
                                                name LIKE ? OR  
                                            lastname LIKE ? OR
                      (concat(name, \" \", lastname) LIKE ? ) 
                                           )" ,
                                            "%#{params[:query]}%",
                                            "%#{params[:query]}%",
                                            "%#{params[:query]}%" ]
                                            )
  end

end

查看

 <% form_tag :controller=>"person",:action=>"search" do %>
    Nombre o Apellido
    <%= text_field_tag "query",  params[:query]
 <% end %>

实施例

 |name|                |Lastname|
 Marcos Ignacio Raul    Perez

我在日志上看到了这个: 如果我搜索马科斯伊格纳西奥劳尔佩雷斯

 SELECT * FROM `people`
 WHERE ((
 name LIKE '%Marcos Ignacio Raul Perez%' OR 
 lastname LIKE '%Marcos Ignacio Raul Perez%'  
 OR (concat(name, " ", lastname) LIKE '%Marcos Ignacio Raul Perez%' )  
 )) 

如果我搜索Ignacio Raul Perez

,则可以使用
 SELECT * FROM `people`
 WHERE ((
 name LIKE '%Ignacio Raul Perez%' OR 
 lastname LIKE '%Ignacio Raul Perez%'  
 OR (concat(name, " ", lastname) LIKE 'Ignacio Raul Perez%' )  
 )) 

如果我搜索Raul Perez

,则可以使用
 SELECT * FROM `people`
 WHERE ((
 name LIKE '%Raul Perez%' OR 
 lastname LIKE '%Raul Perez%'  
 OR (concat(name, " ", lastname) LIKE 'Perez%' )  
 ))   

如果我搜索Marcos Perez

,则无效
 SELECT * FROM `people`
 WHERE ((
 name LIKE '%Marcos Perez%' OR 
 lastname LIKE '%Marcos Perez%'  
 OR (concat(name, " ", lastname) LIKE '%Marcos Perez%' )  
 )) 

如果我搜索Ignacio Perez

,则无效
 SELECT * FROM `people`
 WHERE ((
 name LIKE '%Ignacio Perez%' OR 
 lastname LIKE '%Marcos Perez%'  
 OR (concat(name, " ", lastname) LIKE '%Ignacio Perez%' )  
 ))

如果我搜索Marcos Raul Perez

,则无效
 SELECT * FROM `people`
 WHERE ((
 name LIKE '%Marcos Raul Perez%' OR 
 lastname LIKE '%Marcos Raul Perez%'  
 OR (concat(name, " ", lastname) LIKE '%Marcos Raul Perez%' )  
 )) 

我真的很感激帮助。

2 个答案:

答案 0 :(得分:2)

我强烈建议使用带有轮胎宝石的弹性搜索或类似的东西而不是SQL。看起来您的搜索要求很复杂。您在SQL中进行搜索时遇到的问题表明底层应用程序架构中缺少功能。

答案 1 :(得分:0)

你可以使用Thinking sphinx是rails搜索的好宝石