As pessoas querem encontrar conteúdo. Uma boa pesquisa é essencial .
Pesquisa de texto completo. Usando comandos nativos do MongoDB.
Aplicativo de exemplo:
Por padrão, o Meteor inicia sua própria instância do MongoDB, que não possui indexação/pesquisa de texto completo, então você precisa se tornar nativo .
Se você ainda não possui uma instalação “Real” do MongoDB em seu sistema, instale-o com HomeBrew :
brew update
brew install mongodb
Se você não estiver usando Mac...
Em uma janela de terminal/console, inicie seu banco de dados mongod com o seguinte comando:
mongod --dbpath ~/code/meteor-search/.meteor/local/db --setParameter textSearchEnabled=true
Notas :
Confirme seu funcionamento visitando: http://localhost:28017/ (no seu navegador)
Mais informações sobre como ativar a pesquisa de texto: http://docs.mongodb.org/manual/tutorial/enable-text-search/
Como estamos usando o Mongo "real", precisamos especificá-lo ao iniciar o meteoro. (Isso se aplica apenas enquanto você está desenvolvendo em produção, você definiria um ENV
)
MONGO_URL="mongodb://localhost:27017/meteor" meteor
Se o aplicativo iniciar bem, o jogo começou !
(caso contrário, envie um bug para este repositório e tentarei ajudá-lo!)
Quando você inicializa este aplicativo, ele acessa a API de streaming do Twitter e busca milhares de tweets para você pesquisar ( localmente ). (deixe-o funcionando por alguns minutos e você obterá 10 mil postagens. Ou algumas horas se quiser que centenas de milhares façam testes de estresse na pesquisa)
Se você quiser MUITO conteúdo muito rapidamente, mude a PALAVRA-CHAVE para notícias .
Se você quiser quantidades INSANAS de dados ( ruidosos ) (para simular alto volume ), use:
var KEYWORDS = "katie, justin, kim, beyonce, miley, Obama, 1DWorld, OMG, FML, breaking, news";
Depois de ter algum conteúdo, você precisa garantir que o MongoDB o esteja indexando.
Felizmente, isso é bastante fácil com o método garantirIndex do MongoDB. No nosso caso, vamos simplesmente indexar o campo body do post:
db.posts.ensureIndex( { body: "text" },{ background:true } );
Há um script de inicialização que faz isso automaticamente para você em: server/indexes.js
Dependendo da quantidade de dados que você já inseriu, isso pode levar algum tempo... Eu tinha 92 mil posts (tweets) em meu banco de dados quando o executei e demorou menos de 10 segundos!
Mais detalhes sobre garantirIndex :
db.posts.runCommand( "text", { search: "paypal" } )
Embora isso funcione bem no RoboMongo:
Meteor não suporta o método runCommand :
Então ...
http://stackoverflow.com/questions/17159626/implementing-mongodb-2-4s-full-text-search-in-a-meteor-app/18258688#18258688
Escrevi uma expressão regular simples para transformar palavras-chave com hashtag em links. Em vez de poluir os dados brutos com links (e inchar nossos registros), encontramos/substituímos as #keywords no momento da renderização (lado do cliente) usando um método auxiliar de modelo do 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;
});
Nota : o padrão de link é codificado /search/:keywords
e o método não pode ser encadeado até agora ser perfeito ! Envie uma solicitação pull se você melhorar. :-)
MongoHQ não tem indexação de texto (completa) habilitada por padrão .
Mas eles foram rápidos em me ajudar quando eu pedi: https://twitter.com/nelsonic/statuses/451758108285489152
Você precisará configurar seus índices manualmente com um comando
(no seu cliente Mongo - usamos o RoboMongo - ou na interface da Web)
Depois de configurado, você estará pronto para prosseguir.
No RoboMongo (ou qualquer cliente MongoDB de sua escolha) use o seguinte comando para pesquisar em sua coleção (nos campos que você especificou como pesquisáveis)
db.COLLECTION.runCommand( "text", { search: "KEYWORDS" } );
// e.g:
db.posts.runCommand( "text", { search: "learn" } );
Os resultados da pesquisa retornaram em 0,15 segundos quando eu tinha 327 mil postagens na coleção:
Este projeto usa Iron Router para roteamento de URL.
Se você não está familiarizado com ele ( deveria estar se quiser usar o Meteor com seriedade), leia:
mrt add iron-router
Consulte o arquivo Routes.js para obter mais detalhes sobre como configurei isso para aceitar a solicitação no formato: http://yoursite.com/search/:keywords