2014-09-12 4 views
0

노드 및 mongdodb 백엔드와 함께 FTS 기능을 구현하려고합니다. 검색 결과에서 새 필드, 즉 문서에서 일치하는 문자열을 투영하고 싶습니다. 이것은 그것에게 느낌 같이 google를 줄 것입니다. 누구든지 자신의 커스텀 기능을 많이 쓰지 않고 아이디어를 얻었습니까? 이Mongodb 전체 텍스트 검색, 문서에서 일치하는 문자열 얻기

var version = new mongoose.Schema({  
    name: String,  
    owner: String, 
    reviewer: String, 
    date_of_modification: Date, 
    comments:   String,    
    hints: [String], 
    global: Boolean,  
    **content: { type: [String], index: true }** 
    version_no: Number,     
}); 


var artifactSchema= new mongoose.Schema({ 

    pid : String, 
    trashed : Boolean, 
    baseline : Number, 
    versions : [version],     
}); 

내가 버전 모델의 내용 필드에 인덱스를 생성하고 싶은처럼

스키마 보인다.

+0

은 우리에게 의도 한 문서의 구조와 예상되는 결과를 보여주십시오. 실제로, 그것은 집계를 사용하여 꽤 쉬워야하지만, 의미있는 대답을하기 위해서, 구체적인 예를 들어주세요. –

+0

텍스트 검색 결과의이 종류의 메타 데이터는 현재 사용할 수 없습니다. 또한 원하는 결과가 아닌 코드에서 처리하는 mapReduce 메서드를 사용하지 않고도 응답에서 검색어를 "강조 표시"하기 위해 서버에서 응답을 조사하는 효과적인 방법이 없습니다. 이를 위해 외부 텍스트 검색 엔진을 사용하는 것이 좋습니다. 그리고 Aggregation 프레임 워크는 @MarkusWMahlberg가 제안한대로 문자열을 일치시키는 데 필요한 연산자가 부족하므로 옵션이 아닙니다. –

+0

@NeilLunn : 초기 $ 매치 단계에서 $ 정규식이 작동합니다! 프로젝트 단계에서 문자열 연결을 강조 표시 할 수 있습니다. 또는 나는 무엇인가 놓치고 있냐? –

답변

-1

나는 조금 늦었지만 최근에는 MEAN + angucomplete를 사용하여이를 수행했습니다. AngularJS Query 예. http://localhost:8080/api/search?s= 익스프레스 쿼리

router.route('/search') 
    .get(function(req, res) { 
     Dept.aggregate(
       { $match : { 'Product.name' : new RegExp(query, 'gi') } }, 
       { $project : { name : 1, _id : 1, 'Product.name' : 1, 'Product._id' : 1} }, 
       { $unwind : "$Product" }, 
       { $group : { 
        _id : "$_id", 
        Category : { $addToSet : "$name"}, 
        Product : { $push : "$Product"} 
       }} 
     ) 
    }); 

Angucomplete 마크 업

<div angucomplete-alt id="depts" 
        placeholder="Click Here to Search across Whole Store" 
        pause="300" 
        selected-object="selectedDepts" 
        remote-url="http://localhost:8080/api/search?s=" 
        remote-url-data-field="Departments" 
        remote-url-response-formatter="responseFormatted"  
        search-fields="name" 
        title-field="name" 
        minlength="1" 
        maxlength="20" 
        description-field="description" 
        override-suggestions="true" 
        match-class="highlight" 
        autocapitalize="on" autocorrect="off" autocomplete="off" 
        input-class="form-control form-control-small" 
        class="col-lg-8" 
        ng-pattern="/^[A-Za-z]+$/" 
        docs-search-input-focus 
        > 
    </div> 
관련 문제