我正在寻求实现类型/自动完成搜索以获得乐趣。我在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”属性,并且因为我现在不打算进行全文搜索,因此其中有数千个单词。
我可能想使用trie数据结构来实现它。最重要的是,我可能会说,这样做的一种方法是通过AJAX请求每次击键将被路由到node.js处理程序,然后从那里进行查询到mongoDB将返回每个具有单词的条目有一个字母与用户输入的击键相匹配,作为JSON文件。然后,我将解析该JSON文件并显示每个条目。
接下来的问题是我如何将trie算法纳入我的计划?另一件事是我每次进行CRUD操作时都需要重建索引。
非常感谢任何有关正确方向的建议/指示或任何有助于我这样做的文章。 (我希望做最好的练习/表演方式)谢谢。如果需要澄清这个问题,请告诉我。
答案 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/