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

标签 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 }
}

每次创建、更新或销毁时,我都必须重新索引以更新搜索。搜索将自动完成,例如,当我有两篇分别标题为“Welcome to stackoverflow”和“How to Avoid stackoverflow”的文章并且用户键入一个键 't' 然后我' d 使用 AJAX 显示两篇文章,因为它们的标题中都有字符 't'。我还想突出显示每一个 't'; 'to'中的't',s't'ackoverflow中的't',表示查询命中了一些东西。 (我希望它看起来类似于我们在 stackoverflow.com 上搜索特定的“标签”)

现在的问题是我应该使用不同的架构进行索引,还是只使用我现有的架构?看来我不会使用包含完整文章并包含数千个单词的“body”属性,因为我现在不打算进行全文搜索。

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

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

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

将不胜感激任何建议/指向正确方向或任何文章可以帮助我做到这一点。 (我正在寻找最佳实践/高性能方式)谢谢。让我知道这个问题是否需要澄清。

最佳答案

我认为 trie 行不通。 Trie 通常从字符串的开头开始操作。因此,如果您使用 trie 索引您的标题,则输入“t”的用户将只能在 trie 中搜索 以 t 开头的标题。我认为使用 mongodb 的最佳选择是,除非您有大量文本,否则只需将正则表达式与 $or 运算符结合使用。

在文本输入框中的更改事件中,您需要向 Node 服务器发出 AJAX 请求, Node 服务器将向 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/

关于javascript - 用于自动完成搜索的 MongoDB + Node.js + AJAX 解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9042008/

相关文章:

javascript - 是否可以定义一个将重试加载的层,例如指数退避?

javascript - 如何从 Ajax() 的 innerHTML 缓存 JS 文件?

php - 将数组从 PHP 函数返回到 jQuery

mysql - Node js mysql 实时跟踪数据库表变化

javascript - JSON 键的标准表示法是什么

javascript - 无法使用 jquery 定位所需数据

javascript - 在 Angular2 中使用 guard 捕获重定向路由

javascript - 响应后在 HTML 中附加未知文本

node.js - 使用 PowerShell Invoke-Command 和 Process 使 stdout 显示在控制台上

node.js - node.js 中的 CalDAV?