我正在寻找实现输入/自动完成搜索的乐趣。我在 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/