我的数据结构如下:
User.first.department
=> "devops maintaining staff"
User.second.department
=> "facility staff"
我正在搜索搜索查询,使用单个或多个参数进行搜索,例如:
使用单个参数
进行搜索"staff" # which should return both users
使用多个参数进行搜索
"maintaining devops" # which should return first user
使用单个参数
进行搜索"maintaining" # which should return first user
使用单个参数
进行另一次搜索"facility" # which should return second user
有没有任何有用的例子如何实现这一目标?
答案 0 :(得分:2)
基本上你要求的是子串匹配等声音。我的回答是“蛮力”#34;查询的风格,在实际使用中会很快变得脆弱/崩溃:
# keywords is an array of strings
def keyword_search(keywords)
query = User
keywords.each do |keyword|
query = query.where('department like ?', "%#{keyword}%")
end
query.to_a
end
因此,对于您的示例,您将获得以下查询:
# Returns both users for "staff"
SELECT "users".* FROM "users" WHERE (department like '%staff%')
# Returns first user for "maintaining devops"
SELECT "users".* FROM "users" WHERE (department like '%maintaining%') AND (department like '%devops%')
# Returns first user for "maintaining devops"
SELECT "users".* FROM "users" WHERE (department like '%maintaining%')
# Returns first users for "facility"
SELECT "users".* FROM "users" WHERE (department like '%facility%')
请注意,对于此类解决方案,它是AND
查询,因此所有关键字都必须匹配才能获得结果。查询中的%
符号会使查询略显模糊,因此对于%staff%
,您可以获得以下匹配项:
staff
staffroom
flagstaffs
overstaff
如果你正在寻找更精确的匹配,你可以通过删除%
来调整。
作为Eric suggested,任何比这更复杂的事情都需要更高级的解决方案。
就个人而言,我已经使用Solr/Websolr
并且已经取得了很好的成功,但是查询和搜索调优需要花费一些时间来理解和实现。
答案 1 :(得分:1)
看起来您需要full-text search,这与数据库有关。
这是一个相关的question。对于更高级的内容,您可能需要查看sphinx和thinking-sphinx。