【问题标题】:MongoDB + Node.js + AJAX solution for doing autocomplete search用于自动完成搜索的 MongoDB + Node.js + AJAX 解决方案
【发布时间】:2012-02-20 22:57:29
【问题描述】:

我正在寻找实现输入/自动完成搜索的乐趣。我在 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' 时,我将使用 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 操作时都需要重建索引。

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

【问题讨论】:

    标签: javascript ajax node.js mongodb trie


    【解决方案1】:

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

    在文本输入框中的更改事件中,您需要向节点服务器发出 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 运算符...您可以提供一些示例代码吗?
    • Benny 表示他想在标题、类别或预览文本中搜索该短语。假设它们是不同的字段,您必须使用正则表达式并应用它,并在正则表达式匹配这三个字段中的 any 时返回结果 - 这就是 $or 发挥作用的地方。
    • 这会轰炸 MongoDB 吗?我有一个类似的搜索,但我想知道这是否会严重轰炸 mongo。
    猜你喜欢
    • 2015-07-20
    • 2012-03-03
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    相关资源
    最近更新 更多