在Meteor应用程序中实现MongoDB 2.4的全文search

我正在考虑将全文search添加到meteor应用程序。 我知道MongoDB现在支持这个function,但是我有一些关于实现的问题:

  • 在Meteor应用程序中启用文本searchfunction( textSearchEnabled=true )的最佳方式是什么?
  • 有没有办法从您的应用程序内添加索引( db.collection.ensureIndex() )?
  • 如何从Meteor应用程序中运行Mongo命令(即db.quotes.runCommand( "text", { search: "TOMORROW" } ) )?

既然我的目标是把search添加到望远镜 ,我正在寻找一个“即插即用”的实现,只需要最less的命令行魔术,甚至可以在Heroku或* .meteor.com上工作。

不编辑任何Meteor代码最简单的方法就是使用你自己的mongodb。 你的mongodb.conf应该是这样的(在Arch Linux上它可以在/etc/mongodb.conffind)

 bind_ip = 127.0.0.1 quiet = true dbpath = /var/lib/mongodb logpath = /var/log/mongodb/mongod.log logappend = true setParameter = textSearchEnabled=true 

关键行是setParameter = textSearchEnabled=true ,正如它声明的那样,它启用了文本search。

开始mongod

通过指定MONGO_URL环境variables,告诉meteor使用你自己的mongod

 MONGO_URL="mongodb://localhost:27017/meteor" meteor 

现在说你已经收集称为Dinosaurs collections/dinosaurs.js声明说

 Dinosaurs = new Meteor.Collection('dinosaurs'); 

要为集合创build文本索引,请创build一个文件server/indexes.js

 Meteor.startUp(function () { search_index_name = 'whatever_you_want_to_call_it_less_than_128_characters' // Remove old indexes as you can only have one text index and if you add // more fields to your index then you will need to recreate it. Dinosaurs._dropIndex(search_index_name); Dinosaurs._ensureIndex({ species: 'text', favouriteFood: 'text' }, { name: search_index_name }); }); 

然后,您可以通过Meteor.method公开search,例如在文件server/lib/search_dinosaurs.js

 // Actual text search function _searchDinosaurs = function (searchText) { var Future = Npm.require('fibers/future'); var future = new Future(); Meteor._RemoteCollectionDriver.mongo.db.executeDbCommand({ text: 'dinosaurs', search: searchText, project: { id: 1 // Only take the ids } } , function(error, results) { if (results && results.documents[0].ok === 1) { future.ret(results.documents[0].results); } else { future.ret(''); } }); return future.wait(); }; // Helper that extracts the ids from the search results searchDinosaurs = function (searchText) { if (searchText && searchText !== '') { var searchResults = _searchEnquiries(searchText); var ids = []; for (var i = 0; i < searchResults.length; i++) { ids.push(searchResults[i].obj._id); } return ids; } }; 

然后,您只能发布已在“server / publications.js”中search到的文档

 Meteor.publish('dinosaurs', function(searchText) { var doc = {}; var dinosaurIds = searchDinosaurs(searchText); if (dinosaurIds) { doc._id = { $in: dinosaurIds }; } return Dinosaurs.find(doc); }); 

客户端订阅在client/main.js看起来像这样

 Meteor.subscribe('dinosaurs', Session.get('searchQuery')); 

Timo Brinkmann的道具,他的音乐履带工程是大多数这种知识的来源。

要创build一个文本索引,并尝试添加像这样,我希望这样会有用,如果仍然有问题的评论

来自docs.mongodb.org :


将标量索引字段附加到文本索引,如下面的示例中指定用户名上的升序索引键:

 db.collection.ensureIndex( { comments: "text", username: 1 } ) 

警告您不能包含多键索引字段或地理空间索引字段。

使用文本中的项目选项只返回索引中的字段,如下所示:

 db.quotes.runCommand( "text", { search: "tomorrow", project: { username: 1, _id: 0 } } ) 

注意:默认情况下,_id字段包含在结果集中。 由于示例索引不包含_id字段,因此必须明确排除项目文档中的字段。