我正在寻找实现输入/自动完成搜索的乐趣。我在 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”属性,因为我现在不打算进行全文搜索。
我可能想使用 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/
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll
rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送
当我使用has_one时,它工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.