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

Dan*_*bio 9 regex database postgresql ruby-on-rails

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

id: 1, 
title: "Manhatten and the Murderer", 
year: 1928, 
synopsis: 'some text...' 
rating: 67, 
genre_id, etc. etc.
Run Code Online (Sandbox Code Playgroud)

现在我试图让一系列搜索测试通过,到目前为止我已经做了一个测试用例传递,如果你在文本字段中输入标题"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
Run Code Online (Sandbox Code Playgroud)

我的问题是,我该如何设置?我的问题是"where(title :)行.一个想法是使用Regexp来匹配title属性.任何帮助将不胜感激!谢谢.

rav*_*ode 34

使用搜索中间子字符串的查询:

name = "Manhattan"
Movie.where("title like ?", "%#{name}%")
Run Code Online (Sandbox Code Playgroud)

例如:

  • %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
Run Code Online (Sandbox Code Playgroud)

使用索引编制数据 rake ts:index

然后运行Sphynx: rake ts:start

您可以像这样搜索:

Movie.search :conditions => {:synopsis => "Manhattan"}


Elastic Search是ThinkingSphinx的绝佳替代品,甚至还有关于它的RailsCast,所以你一定要看看真正适合你的东西......希望这会有所帮助!

  • 如果你想要不区分大小写,在PostgreSQL中你可以使用`ilike`.或者使用`〜*`运算符和正则表达式. (5认同)

Rai*_*Fan 5

您不需要正则表达式即可查找具有搜索字符串的电影。您可以这样使用SQL查询:

Movie.where('title LIKE ?','Batman%')
Run Code Online (Sandbox Code Playgroud)

那将返回所有以“蝙蝠侠”开头的电影

Movie.where('title LIKE ?','%Batman%')
Run Code Online (Sandbox Code Playgroud)

那将返回标题中任何地方都有蝙蝠侠的所有电影。我认为您已经知道'%'是查询中的小丑字符。

  • 我知道你在那里做了什么。 (3认同)