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

8

我希望实现一个类型前瞻/自动完成搜索功能,这涉及IT技术。我的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',在 'to' 中的 't''t' 在 s't'ackoverflow 中,表明查询命中了某些内容。(我希望看起来类似于我们在 stackoverflow.com 上搜索特定“标签”的情况)
现在的问题是,我应该使用不同的索引架构,还是只是坚持使用现有的架构?因为我现在不需要进行全文搜索,所以似乎我不会使用包含数千个单词的“body”属性。
  • 标题属性可能只有 ~45 个字符和平均 3 或 4 个单词。
  • 分类通常只有一个单词,平均 9-15 个字符。
  • 预览将是最大的数据集,约有 ~150 个字符和平均 20 个单词。
我可能想要使用 trie 数据结构来实现这一点。我首先想到的方法是,每击键一次都会发出 AJAX 请求,该请求将路由到 node.js 处理程序,然后从那里进行查询,以返回具有与用户键入的击键匹配的字母的单词的每个条目作为 JSON 文件。然后,我将解析该 JSON 文件并显示每个条目。
那么问题是,我如何将 trie 算法融入我的计划中?另一件事是,每次进行 CRUD 操作时都需要重新构建索引。
如果您能给出任何建议/指向正确方向的指针或可以帮助我完成此操作的任何文章(我正在寻求最佳实践/性能最佳的方法),我将不胜感激。谢谢。让我知道是否需要澄清问题。
1个回答

8
我认为trie不适用。Trie通常从字符串的开头开始操作。因此,如果您使用trie来索引标题,用户键入“t”时,只能搜索以“t”开头的标题。我认为在使用mongodb时,除非有大量文本,否则最好使用正则表达式与$or运算符结合使用。
在文本输入框中的更改事件上,您需要向node服务器发出AJAX请求,如您所说,该服务器将向mongodb发出查询并在JSON数组中返回结果。
Mongo中的正则表达式:http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-RegularExpressions $or运算符:http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24or jQuery UI如何处理自动完成的演示(用于参考AJAX请求和填充值):http://jqueryui.com/demos/autocomplete/

为什么需要$or运算符...你有一些示例代码吗? - MonkeyBonkey
1
Benny 表示他想在标题、类别或预览文本中搜索该短语。假设它们是不同的字段,您需要使用正则表达式并应用它,当正则表达式匹配任何这三个字段时返回结果 - 这就是 $or 起作用的地方。 - btoconnor
这会炸掉MongoDB吗?我有一个类似的搜索,但我想知道这是否会严重影响Mongo。 - Zlatko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接