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

时间:2012-01-28 00:51:59

标签: javascript ajax node.js mongodb trie

我正在寻求实现类型/自动完成搜索以获得乐趣。我在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 }
}

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:8)

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

在文本输入框中的更改事件中,您将要向您的节点服务器发出一个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/