我有一个包含电影列表的数据库。典型的条目如下所示:
id: 1,
title: "Manhatten and the Murderer",
year: 1928,
synopsis: 'some text...'
rating: 67,
genre_id, etc. etc.
现在我正在尝试通过一系列搜索测试,到目前为止我已经通过一个测试用例传递,如果你在文本字段中键入标题“Manhatten and the Murderer”,它会找到你的电影想。问题在于部分匹配。
现在我想要一种搜索“Manhat”并匹配记录“Manhatten and the Murderer”的方法。我也希望它与任何有“Manhat”的电影相匹配。例如,它可能会返回2或3个其他标题:“我在曼哈顿的生活”,标题:“曼哈顿的大苹果”等等。
以下是我在Movie模型中到目前为止的代码:
def self.search(query)
# Replace this with the appropriate ActiveRecord calls...
if query =~ where(title:)
#where(title: query)
binding.pry
end
end
我的问题是,我该如何设置?我的问题是“where(title :)行。一个想法是使用Regexp来匹配title属性。任何帮助都将不胜感激!谢谢。
答案 0 :(得分:33)
使用搜索中间子字符串的查询:
name = "Manhattan"
Movie.where("title like ?", "%#{name}%")
例如:
%Manhattan
会抓住您:Love in Manhattan
Manhattan%
将获得:Manhattan and Company
%Manhattan%
会同时为您提供:[Love in Manhattan, Manhattan and Company]
但是,如果您正在搜索电影简介,则应使用Thinking Sphinx或Elastic Search
例如,使用Elastic Search,您可以设置如下概要:
添加app/indices/movie_index.rb
:
ThinkingSphinx::Index.define :movie, :with => :active_record do
# fields
indexes title, :sortable => true
indexes synopsis
end
使用rake ts:index
然后用rake ts:start
您可以像这样搜索:
Movie.search :conditions => {:synopsis => "Manhattan"}
Elastic Search是ThinkingSphinx的绝佳替代品,甚至还有一个RailsCast,所以你一定要看看最适合你的是什么......希望这会有所帮助!
答案 1 :(得分:4)
您不需要正则表达式来查找具有搜索字符串的电影。您可以像这样使用SQL查询:
Movie.where('title LIKE ?','Batman%')
这将使所有电影以"蝙蝠侠"
开头Movie.where('title LIKE ?','%Batman%')
这将归还所有拥有蝙蝠侠任何地方电影的电影。 我想你已经找到了'%'是查询中的小丑角色。
答案 2 :(得分:0)
一种选择是在Rails应用程序旁边运行搜索服务器。这当然是我的解决方案。这条路线提供了许多Rails本身没有的功能,可能有点过分,但值得考虑。
我使用Sphinx并使用思考sphinx gem实现它。
资源: