【问题标题】:Ruby on Rails Active Record - Search with multiple arguments using IN conditionRuby on Rails Active Record - 使用 IN 条件搜索多个参数
【发布时间】:2017-06-15 00:38:45
【问题描述】:

我的数据结构如下:

User.first.department
=> "devops maintaining staff"

User.second.department
=> "facility staff"

我正在搜索一个 搜索查询,该查询使用 singlemultiple arguments 进行搜索,例如:

  • 使用单参数搜索

    "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
    

有什么有用的例子可以做到这一点吗?

【问题讨论】:

  • 你的数据库是什么?
  • 我在开发中使用 SQLite,在生产中使用 MySQL
  • 您在寻找完全匹配还是模糊?这将真正改变您问题的答案。
  • 没关系,欢迎简单解决
  • 您是否考虑过重新设计您的数据库表结构?好像您在单个字符串字段中嵌入了 N:M 关系。这样做可能有一些原因,但通常不鼓励这样做(它会导致类似这样的问题)

标签: ruby-on-rails activerecord


【解决方案1】:

看起来你需要full-text search,这是依赖于数据库的。

这是一个相关的question。对于更高级的内容,您可能需要查看 sphinxthinking-sphinx

【讨论】:

    【解决方案2】:

    基本上你所要求的听起来像是子字符串匹配。我的回答是一种“蛮力”的查询方式,在实际使用中它会很快变得脆弱/崩溃:

    # 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

    如果您正在寻找更精确的匹配项,您可以通过删除 %s 来进行调整。


    作为Eric suggested,任何比这更复杂的事情都需要更高级的解决方案。

    我个人使用过Solr/Websolr 并取得了很好的成功,但查询和搜索调优需要一些工作才能理解和实施。

    【讨论】:

    • 是否可以对所有这 4 个示例进行匹配的搜索查询?
    • @StefHej 确实如此。你试过代码了吗?你是如何测试它不起作用的?
    • 是的,它连接每个关键字与AND。有没有办法用OR 做到这一点?
    • @StefHej 您的问题确实有任何需要OR 谓词的情况。上面的代码可以修改为使用带有 rails 的 or 语句的 OR 子句:stackoverflow.com/a/32753177/33226
    • 好的,我试试这个。非常感谢!
    猜你喜欢
    • 2018-05-08
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    相关资源
    最近更新 更多