如何将部分字符串与数据库对象的属性进行匹配?正则表达式?

时间:2014-03-23 20:47:46

标签: ruby-on-rails regex database postgresql

我有一个包含电影列表的数据库。典型的条目如下所示:

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属性。任何帮助都将不胜感激!谢谢。

3 个答案:

答案 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 SphinxElastic 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

运行Sphynx

您可以像这样搜索:

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实现它。

资源:

http://pat.github.io/thinking-sphinx/

http://sphinxsearch.com/