ผู้คนต้องการค้นหาเนื้อหา การค้นหาที่ดีเป็นสิ่งจำเป็น
ค้นหาข้อความแบบเต็ม การใช้คำสั่ง Native MongoDB
แอพตัวอย่าง:
ตามค่าเริ่มต้น Meteor จะเริ่มต้นอินสแตนซ์ MongoDB ของตัวเอง ซึ่งไม่มีการจัดทำดัชนี/ค้นหาข้อความแบบเต็ม ดังนั้นคุณจึงต้อง ใช้งาน Native
หากคุณยังไม่มีการติดตั้ง MongoDB "Real" บนระบบของคุณ ให้ติดตั้งด้วย HomeBrew :
brew update
brew install mongodb
หากคุณไม่ได้ใช้ Mac ...
ในหน้าต่างเทอร์มินัล/คอนโซลให้เริ่มต้น mongod databse ของคุณด้วยคำสั่งต่อไปนี้:
mongod --dbpath ~/code/meteor-search/.meteor/local/db --setParameter textSearchEnabled=true
หมายเหตุ :
ยืนยันการทำงานโดยไปที่: http://localhost:28017/ (ในเบราว์เซอร์ของคุณ)
ข้อมูลเพิ่มเติม เกี่ยวกับการเปิดใช้งานการค้นหาข้อความ: http://docs.mongodb.org/manual/tutorial/enable-text-search/
เนื่องจากเราใช้ Mongo "ของจริง" เราจึงต้องระบุมันเมื่อเริ่มดาวตก (สิ่งนี้ใช้เฉพาะในขณะที่คุณกำลังพัฒนาในเวอร์ชันที่ใช้งานจริง คุณจะต้องตั้งค่า ENV
-
MONGO_URL="mongodb://localhost:27017/meteor" meteor
หากแอปเริ่มทำงานได้ แสดงว่า เกมเปิดอยู่ !
(มิฉะนั้น ให้ส่งข้อบกพร่อง ไปที่ repo นี้และเราจะพยายามช่วยเหลือคุณ!)
เมื่อคุณบูตแอปนี้ แอปจะเข้าถึง Twitter Streaming API และดึงทวีตนับพันเพื่อให้คุณค้นหาผ่าน ( ในเครื่อง ) (ปล่อยทิ้งไว้สักครู่แล้วคุณจะได้รับโพสต์ 10,000 โพสต์ หรือไม่กี่ชั่วโมงหากคุณต้องการให้โพสต์ทดสอบความเครียดนับแสนโพสต์)
หากคุณต้องการเนื้อหา จำนวน มากอย่างรวดเร็ว ให้เปลี่ยน KEYWORD เป็น news
หากคุณต้องการข้อมูล ( ที่มีเสียงดัง ) จำนวน INSANE (เพื่อจำลอง ปริมาณสูง ) ให้ใช้:
var KEYWORDS = "katie, justin, kim, beyonce, miley, Obama, 1DWorld, OMG, FML, breaking, news";
เมื่อคุณมีเนื้อหาบางส่วนแล้ว คุณต้องแน่ใจว่า MongoDB กำลังสร้างดัชนีเนื้อหานั้น
โชคดีที่วิธีนี้ค่อนข้าง ง่าย เมื่อใช้วิธี SureIndex ของ MongoDB ในกรณีของเรา เราจะจัดทำดัชนีฟิลด์ เนื้อหา ของโพสต์:
db.posts.ensureIndex( { body: "text" },{ background:true } );
มีสคริปต์ เริ่มต้น ที่ทำงานให้คุณโดยอัตโนมัติที่: server/indexes.js
อาจต้องใช้เวลาสักระยะ... ฉันมีโพสต์ (ทวีต) 92,000 โพสต์ในฐานข้อมูลของฉันเมื่อฉันเรียกใช้ ทั้งนี้ขึ้นอยู่กับจำนวนข้อมูลที่คุณใส่ไว้ และใช้เวลาน้อยกว่า 10 วินาที!
รายละเอียดเพิ่มเติมเกี่ยวกับ SureIndex :
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
ฉันเขียนนิพจน์ทั่วไปง่ายๆ เพื่อเปลี่ยนคำหลักที่ติดแฮชแท็กให้เป็นลิงก์ แทนที่จะสร้างมลพิษให้กับข้อมูลดิบด้วยลิงก์ (และขยายบันทึกของเรา) เราจะค้นหา/แทนที่ #keywords ณ เวลาแสดงผล (ฝั่งไคลเอ็นต์) โดยใช้วิธีตัวช่วยเทมเพลตของ Handlebars:
// 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 - หรือเว็บอินเตอร์เฟส)
เมื่อตั้งค่าแล้วคุณก็พร้อมที่จะไป
ใน RoboMongo (หรือไคลเอนต์ MongoDB ที่คุณเลือก) ใช้คำสั่งต่อไปนี้เพื่อค้นหาคอลเลกชันของคุณ (ในฟิลด์ที่คุณระบุว่าสามารถค้นหาได้)
db.COLLECTION.runCommand( "text", { search: "KEYWORDS" } );
// e.g:
db.posts.runCommand( "text", { search: "learn" } );
ผลการค้นหากลับมาใน 0.15 วินาที เมื่อฉันมี โพสต์ 327,000 โพสต์ ในคอลเลกชัน:
โปรเจ็กต์นี้ใช้ Iron Router สำหรับการกำหนดเส้นทาง URL
หากคุณไม่คุ้นเคย (คุณ ควร จะทราบหากคุณจริงจังกับการใช้ Meteor) โปรดอ่าน:
mrt add iron-router
ดูไฟล์ Routes.js สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับวิธีที่ฉันได้เชื่อมต่อสิ่งนี้เพื่อยอมรับคำขอในรูปแบบ: http://yoursite.com/search/:keywords