La gente quiere encontrar contenido. Una buena búsqueda es fundamental .
Búsqueda de texto completo. Usando comandos nativos de MongoDB.
Aplicación de ejemplo:
De forma predeterminada, Meteor inicia su propia instancia de MongoDB, que no tiene indexación/búsqueda de texto completo, por lo que debe volverse nativo .
Si aún no tiene una instalación "real" de MongoDB en su sistema, instálela con HomeBrew :
brew update
brew install mongodb
Si no estás usando Mac...
En una ventana de terminal/consola, inicie su base de datos mongod con el siguiente comando:
mongod --dbpath ~/code/meteor-search/.meteor/local/db --setParameter textSearchEnabled=true
Notas :
Confirme su funcionamiento visitando: http://localhost:28017/ (en su navegador)
Más información sobre cómo habilitar la búsqueda de texto: http://docs.mongodb.org/manual/tutorial/enable-text-search/
Debido a que estamos usando Mongo "real", debemos especificarlo al iniciar Meteor. (Esto solo se aplica mientras estás desarrollando en producción, establecerías un ENV
)
MONGO_URL="mongodb://localhost:27017/meteor" meteor
Si la aplicación se inicia correctamente, ¡el juego está activado !
(de lo contrario, envía un error a este repositorio e intentaré ayudarte).
Cuando inicie esta aplicación, accederá a la API de transmisión de Twitter y buscará miles de tweets para que los busque ( localmente ). (déjelo funcionando durante unos minutos y obtendrá 10.000 publicaciones. O unas horas si desea que cientos de miles realicen una prueba de esfuerzo de búsqueda)
Si desea MUCHO contenido muy rápidamente, cambie la PALABRA CLAVE a noticias .
Si desea cantidades INCREÍBLES de datos ( ruidosos ) (para simular un volumen alto ), use:
var KEYWORDS = "katie, justin, kim, beyonce, miley, Obama, 1DWorld, OMG, FML, breaking, news";
Una vez que tenga algún contenido, debe asegurarse de que MongoDB lo esté indexando.
Afortunadamente, esto es bastante fácil con el método sureIndex de MongoDB. En nuestro caso simplemente vamos a indexar el campo del cuerpo de la publicación:
db.posts.ensureIndex( { body: "text" },{ background:true } );
Hay un script de inicio que hace esto automáticamente en: server/indexes.js
Dependiendo de la cantidad de datos que ya haya insertado, esto puede llevar algún tiempo... ¡Tenía 92.000 publicaciones (tweets) en mi base de datos cuando la ejecuté y me tomó menos de 10 segundos!
Más detalles sobre sureIndex :
db.posts.runCommand( "text", { search: "paypal" } )
Si bien esto funciona bien en RoboMongo:
Meteor no admite el método runCommand :
Entonces ...
http://stackoverflow.com/questions/17159626/implementing-mongodb-2-4s-full-text-search-in-a-meteor-app/18258688#18258688
Escribí una expresión regular simple para convertir las palabras clave con hashtag en enlaces. En lugar de contaminar los datos sin procesar con enlaces (e inflar nuestros registros), encontramos/reemplazamos las #palabras clave en el momento del renderizado (del lado del cliente) usando un método auxiliar de plantilla de manillar:
// 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 : el patrón de enlace está codificado /search/:keywords
y el método no se puede encadenar, ¡ni mucho menos que perfecto ! Envíe una solicitud de extracción si la mejora. :-)
MongoHQ no tiene habilitada la indexación de texto (completo) de forma predeterminada .
Pero fueron rápidos en ayudarme cuando lo pedí: https://twitter.com/nelsonic/statuses/451758108285489152
Necesitará configurar sus índices manualmente con un comando
(ya sea en su Cliente Mongo - Usamos RoboMongo - o la Interfaz Web)
Una vez que esté configurado, estará listo para comenzar.
En RoboMongo (o cualquier Cliente MongoDB de su elección) use el siguiente comando para buscar en su colección (en los campos que especificó como buscables)
db.COLLECTION.runCommand( "text", { search: "KEYWORDS" } );
// e.g:
db.posts.runCommand( "text", { search: "learn" } );
Los resultados de la búsqueda se obtuvieron en 0,15 segundos cuando tenía 327.000 publicaciones en la colección:
Este proyecto utiliza Iron Router para el enrutamiento de URL.
Si no está familiarizado con él ( debería estarlo si realmente quiere usar Meteor), lea:
mrt add iron-router
Consulte el archivo route.js para obtener más detalles sobre cómo lo conecté para aceptar la solicitud en el formulario: http://yoursite.com/search/:keywords