사람들은 콘텐츠를 찾고 싶어합니다. 좋은 검색이 필수적입니다 .
전체 텍스트 검색. 네이티브 MongoDB 명령 사용.
예시 앱:
기본적으로 Meteor는 자체 MongoDB 인스턴스를 시작합니다. 여기에는 전체 텍스트 인덱싱/검색 기능이 없으므로 기본으로 전환 해야 합니다.
시스템에 MongoDB의 "실제" 설치가 아직 없는 경우 HomeBrew를 사용하여 설치하십시오.
brew update
brew install mongodb
맥을 사용하지 않는다면...
터미널/콘솔 창에서 다음 명령을 사용하여 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에 액세스하여 ( 로컬 로) 검색할 수천 개의 트윗을 가져옵니다. (몇 분 동안 실행하면 10,000개의 게시물을 얻을 수 있습니다. 또는 수십만 개의 스트레스 테스트 검색을 원하는 경우 몇 시간 정도)
많은 양 의 콘텐츠를 매우 빠르게 보려면 KEYWORD를 news 로 변경하세요.
엄청난 양의 ( 시끄러운 ) 데이터를 원한다면 ( 높은 볼륨을 시뮬레이션하기 위해) 다음을 사용하십시오.
var KEYWORDS = "katie, justin, kim, beyonce, miley, Obama, 1DWorld, OMG, FML, breaking, news";
콘텐츠가 있으면 MongoDB가 해당 콘텐츠를 인덱싱하는지 확인해야 합니다.
고맙게도 MongoDB의 verifyIndex 메소드를 사용하면 매우 쉽습니다 . 우리의 경우에는 단순히 게시물의 본문 필드를 색인화하겠습니다.
db.posts.ensureIndex( { body: "text" },{ background:true } );
server/indexes.js 에는 이 작업을 자동으로 수행하는 시작 스크립트가 있습니다.
이미 삽입한 데이터의 양에 따라 다소 시간이 걸릴 수 있습니다... 실행했을 때 DB에 92,000개의 게시물(트윗)이 있었는데 10초도 채 걸리지 않았습니다!
verifyIndex 에 대한 자세한 내용:
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를 사용합니다 - 또는 웹 인터페이스에서)
일단 설정되면 갈 수 있습니다.
RoboMongo(또는 원하는 MongoDB 클라이언트)에서 다음 명령을 사용하여 컬렉션(검색 가능으로 지정한 필드)을 검색합니다.
db.COLLECTION.runCommand( "text", { search: "KEYWORDS" } );
// e.g:
db.posts.runCommand( "text", { search: "learn" } );
컬렉션에 327,000개의 게시물이 있을 때 0.15초 만 에 검색 결과가 반환되었습니다.
이 프로젝트에서는 URL 라우팅을 위해 Iron Router를 사용합니다.
익숙하지 않다면(Meteor 사용에 대해 진지하게 생각하고 있다면 익숙 해야 합니다 ) 다음을 읽어보세요.
mrt add iron-router
http://yoursite.com/search/:keywords
형식의 요청을 수락하기 위해 어떻게 연결했는지에 대한 자세한 내용은 Routes.js 파일을 참조하세요.