用于执行自动完成搜索的MongoDB + Node.js + AJAX解决方案

Ben*_*jia 8 javascript ajax trie mongodb node.js

我正在寻找实现类型/自动完成搜索的乐趣.我在mongoDB中的架构中有一些属性,但我希望只能按类别,标题,预览或日期进行搜索.

这是我对单篇文章的mongoDB架构(我使用mongoose作为ORM):

{
    title: { type: String, required: true}
    , preview: { type: String, required: true}
    , body: { type: String, required: true}
    , category: {type: String}
    , created_at: { type: Date, default: Date.now }
}
Run Code Online (Sandbox Code Playgroud)

每次我创建,更新或销毁时,我都必须重新编制索引,以便更新搜索.搜索将自动完成,例如,当我有两篇文章分别标题为"欢迎使用stackoverflow"和"如何避免stackoverflow"并且用户键入一个键时,'t'我会使用AJAX显示两篇文章,因为两者都有字符't'在他们的头衔.我也想强调每一个't'; 在't''to','t'以s 't'ackoverflow,表示查询命中东西.(我希望它看起来与我们在stackoverflow.com上搜索特定'标签'时类似)

现在的问题是我应该使用不同的模式进行索引,还是仅仅坚持我现有的模式?似乎我不会使用包含完整文章的'body'属性,并且其中包含数千个单词,因为我现在不打算进行全文搜索.

  • 标题属性可能只有~45个字符,平均3或4个字.
  • 类别大多只有1个单词,平均9-15个字符.
  • 预览将是最大的数据集,其中包含约150个字符和20个字.

我可能想用trie数据结构来实现它.最重要的是,我可能会说,这样做的一种方法是通过AJAX请求每次击键将被路由到node.js处理程序,然后从那里进行查询到mongoDB将返回每个具有单词的条目有一个字母与用户输入的击键相匹配,作为JSON文件.然后,我将解析该JSON文件并显示每个条目.

那么问题是我如何将trie算法纳入我的计划?另一件事是我每次进行CRUD操作时都需要重建索引.

非常感谢任何有关正确方向的建议/指示或任何有助于我这样做的文章.(我希望做最好的练习/表演方式)谢谢.如果需要澄清这个问题,请告诉我.

小智 8

我认为trie不会起作用.Trie通常从字符串的开头开始操作.因此,如果您使用trie索引标题,则键入"t"的用户只能搜索以tr 开头的标题.我认为使用mongodb是最好的选择,除非你有大量的文本,只需要将正则表达式与$或运算符结合使用.

在文本输入框中的change事件中,您将要向您的节点服务器发出一个AJAX请求,该服务器将向mongodb发出查询并以JSON数组的形式返回结果.

mongo中的正则表达式:http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-RegularExpressions

$或运营商:http: //www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24or

关于jQuery UI如何处理自动完成的演示(供AJAX请求参考并填写值):http: //jqueryui.com/demos/autocomplete/