Люди хотят найти контент. Хороший поиск имеет важное значение .
Полнотекстовый поиск. Использование собственных команд 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, нам нужно указать его при запуске метеора. (Это применимо только во время разработки в производстве, вы должны установить ENV
)
MONGO_URL="mongodb://localhost:27017/meteor" meteor
Если приложение запускается нормально, игра включена !
(в противном случае отправьте сообщение об ошибке в этот репозиторий, и я постараюсь вам помочь!)
Когда вы загрузите это приложение, оно получит доступ к API Twitter Streaming и получит тысячи твитов для поиска ( локально ). (оставьте его включенным на несколько минут, и вы получите 10 тысяч постов. Или несколько часов, если вы хотите, чтобы сотни тысяч прошли стресс-тест поиска)
Если вы хотите получить МНОГО контента очень быстро, измените КЛЮЧЕВОЕ СЛОВО на новости .
Если вам нужны БЕЗУМНЫЕ объемы ( шумных ) данных (для имитации большого объема ), используйте:
var KEYWORDS = "katie, justin, kim, beyonce, miley, Obama, 1DWorld, OMG, FML, breaking, news";
Если у вас есть контент, вам необходимо убедиться, что MongoDB его индексирует.
К счастью, это довольно просто с помощью метода обеспеченияИндекс MongoDB. В нашем случае мы просто собираемся индексировать поле тела сообщения:
db.posts.ensureIndex( { body: "text" },{ background:true } );
Существует сценарий запуска , который делает это автоматически по адресу: server/indexes.js.
В зависимости от того, сколько данных вы уже вставили, это может занять некоторое время... Когда я запускал мою базу данных, в моей базе данных было 92 тыс. сообщений (твитов), и это заняло менее 10 секунд!
Более подробная информация о обеспеченияИндекс :
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 тысяч постов в коллекции:
Этот проект использует Iron Router для маршрутизации URL-адресов.
Если вы с ним не знакомы ( должны быть знакомы, если серьезно относитесь к использованию Meteor), прочитайте:
mrt add iron-router
Более подробную информацию о том, как я подключил это для приема запроса в форме, см. в файле Routes.js : http://yoursite.com/search/:keywords