人們想要找到內容。良好的搜索是必不可少的。
全文搜尋。使用本機MongoDB 指令。
範例應用程式:
預設情況下,Meteor 啟動自己的 MongoDB 實例,它沒有全文索引/搜索,因此您需要使用本機。
如果您的系統上尚未「真正」安裝 MongoDB,請使用HomeBrew安裝它:
brew update
brew install mongodb
如果您不使用 Mac...
在終端機/控制台視窗中使用以下命令啟動 mongod 資料庫:
mongod --dbpath ~/code/meteor-search/.meteor/local/db --setParameter textSearchEnabled=true
注意事項:
透過造訪以下位址確認其工作:http://localhost:28017/(瀏覽器中)
啟用文字搜尋的詳細資訊:http://docs.mongodb.org/manual/tutorial/enable-text-search/
因為我們使用的是「真正的」Mongo,所以我們需要在啟動 Meteor 時指定它。 (這僅適用於當您在生產環境中進行開發時,您將設定 ENV
)
MONGO_URL="mongodb://localhost:27017/meteor" meteor
如果應用程式啟動正常,遊戲就開始了!
(否則請向此存儲庫提交錯誤,我將盡力幫助您!)
當您啟動此應用程式時,它將訪問 Twitter Streaming API 並獲取數千條推文供您搜尋(本地)。 (讓它運行幾分鐘,您將獲得 10k 個帖子。如果您想要數十萬個帖子對搜索進行壓力測試,則需要幾個小時)
如果您想要快速獲得大量內容,請將關鍵字變更為news 。
如果您想要大量(雜訊)資料(以模擬高容量),請使用:
var KEYWORDS = "katie, justin, kim, beyonce, miley, Obama, 1DWorld, OMG, FML, breaking, news";
一旦您擁有一些內容,您需要確保 MongoDB 正在為其建立索引。
值得慶幸的是,使用 MongoDB 的EnsureIndex方法這非常容易。在我們的例子中,我們只需索引帖子的正文字段:
db.posts.ensureIndex( { body: "text" },{ background:true } );
有一個啟動腳本可以自動為您執行此操作: server/indexes.js
根據您已插入的資料量,這可能需要一些時間...當我運行它時,我的資料庫中有 92k 個帖子(推文),並且花費了不到 10 秒!
有關EnsureIndex的更多詳細資訊:
db.posts.runCommand( "text", { search: "paypal" } )
雖然這在 RoboMongo 中運作良好:
Meteor 不支援runCommand方法:
所以 ...
http://stackoverflow.com/questions/17159626/implementing-mongodb-2-4s-full-text-search-in-a-meteor-app/18258688#18258688
我編寫了一個簡單的正規表示式,將主題標籤關鍵字轉換為連結。我們不會使用連結污染原始資料(並使我們的記錄膨脹),而是使用 Handlebars 模板幫助程式方法在渲染時(客戶端)查找/替換 #keywords:
// place this code in your main.js or inside an Meteor.isClient block
Handlebars.registerHelper('highlight', function(text) {
var hashtagPattern = /s*(#w*)/gi,
link = "/search/",
m, match, matches = [], t, url ='';
// initial check for hashtag in text
if(text.indexOf("#") !== -1) {
// find all #keywords (that have hashtags)
while ( (match = hashtagPattern.exec(text)) ) {
matches.push(match[0]);
}
// replace any #keywords with <a href="/search/keywords">#keywords</a>
for(var j=0; j < matches.length; j++) {
m = matches[j].replace(/s/g, "");
// console.log('match',m);
url = link+m;
url = url.replace('#',"").toLowerCase(); // remove hashtag for lookup
t = " <a class='hashtag' href='"+url+"'>"+m+"</a> "; // replace with
replace = new RegExp("\s*("+m+")", 'gi');
text = text.replace(replace, t);
}
}
return text;
});
注意:連結模式是硬編碼的/search/:keywords
,並且方法遠非完美可連結!如果您對其進行了改進,請發送拉取請求。 :-)
MongoHQ預設沒有啟用(完整)文字索引。
但當我提出要求時,他們很快就幫助了我:https://twitter.com/nelsonic/statuses/451758108285489152
您需要使用命令手動設定索引
(在您的 Mongo 用戶端中 - 我們使用 RoboMongo - 或 Web 介面)
設定完成後,您就可以開始了。
在 RoboMongo(或您選擇的任何 MongoDB 用戶端)中,使用以下命令搜尋您的集合(在您指定為可搜尋的欄位上)
db.COLLECTION.runCommand( "text", { search: "KEYWORDS" } );
// e.g:
db.posts.runCommand( "text", { search: "learn" } );
當我的集合中有327k 個帖子時,搜尋結果在0.15 秒內返回:
此專案使用 Iron Router 進行 url 路由。
如果您不熟悉它(如果您認真使用 Meteor,那麼您應該熟悉它),請閱讀:
mrt add iron-router
有關如何連接它以接受表單中的請求的更多詳細信息,請參閱routes.js檔案:http: http://yoursite.com/search/:keywords