【问题标题】:Implement autocomplete on MongoDB在 MongoDB 上实现自动完成
【发布时间】:2012-01-03 15:53:17
【问题描述】:

假设我有一组用户,并希望对这些用户的用户名实施自动完成。我查看了 mongodb 文档,$regex 似乎是一种方法。有没有更好的办法?更好是指更高性能/更好的实践。

【问题讨论】:

    标签: ruby-on-rails mongodb autocomplete


    【解决方案1】:

    正如@Thilo 所建议的,您可以使用多种想法,包括前缀。

    最重要的是有非常快速的请求(因为你希望自动完成感觉瞬间)。所以你必须使用能够正确使用索引的查询。

    使用正则表达式:使用/^prefix/(重要的是 ^ 指定行首,这是使查询使用索引所必需的)。

    范围查询也不错:{ $gt : 'jhc', $lt: 'jhd' } }

    更复杂但更快:您可以将前缀树存储在 mongo(又名尝试)中,条目如下:

     {usrPrefix : "anna", compl : ["annaconda", "annabelle", "annather"]}
     {usrPrefix : "ann", compl : ["anne", "annaconda", "annabelle", "annather"]}
    

    最后一个解决方案非常快(当然,如果索引在 compl 上),但根本不节省空间。您知道自己也可以选择权衡取舍。

    【讨论】:

    • 优秀的答案。虽然没有完成尝试。就我个人而言,在 Mongo 中使用正则表达式时,我从未有过“即时”的感觉。这应该可以让它更快!
    • 确实,mongo 中的正则表达式并没有很好地实现。然而,当你想要一些你不认为实时查询数据库的东西时,延迟太高了。实现自动完成的正确方法是异步加载一些常用的完成,并随着时间(和用户输入)的进行而完成。
    【解决方案2】:

    我们使用正则表达式,只要您有索引并且使用 /^value/,它就会很快

    请注意,您不能对索引使用不区分大小写的选项,因此您可能希望将字符串的小写版本存储为文档中的另一个字段,并将其用于自动完成。

    我已经对超过 300 万份文档进行了测试,但它仍然是即时的。

    【讨论】:

      【解决方案3】:

      如果您正在寻找前缀,您可以使用范围查询(不确定确切的语法):

      db.users.find({'username': { $gt : 'jhc', $lt: 'jhd' } } )
      

      你想要一个用户名字段的索引。

      【讨论】:

      • 你能解释一下这个例子中范围查询是如何工作的吗?例如,如果我的收藏中有“猫”,“ca”如何返回正确的术语。
      • 您可以搜索“ca”和“cb”之间的所有内容。 ca < cats < cb
      猜你喜欢
      • 1970-01-01
      • 2016-06-23
      • 2018-08-08
      • 1970-01-01
      • 2015-07-05
      • 1970-01-01
      • 2018-04-23
      • 2013-01-28
      • 1970-01-01
      相关资源
      最近更新 更多