在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.conf
find)
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字段,因此必须明确排除项目文档中的字段。