2016-11-08 1 views
1

아포스트로피 검색을 사용하여 부분 문자열 일치 검색을 수행 할 수있는 설정 (또는 스 니펫)이 있습니까? 예 : "blue"를 검색하면 "Learning Management Blueprint"라는 제목의 항목이 반환됩니다.부분 문자열 검색

+0

이 작동합니다 var에 커서 = self.apos.docs.find (REQ, { lowSearchText :/블루/ } ) 그러나이에게 변수를 만들기 하지 않습니다. 이것은 동등하고 작동하지 않아야합니까? var searchText = 'blue'; var cursor = self.apos.docs.find (req, { lowSearchText : searchText } ) –

답변

0

: 경우 다른 사람이 필요에서, 여기에 관련 LIB \ 모듈 \ 아포스트로피 검색 \의하는 index.js 코드입니다.

당신의 해결책은 효과가 있지만, 심각한 우려 사항 중 하나는 .*과 같은 정규 표현식 메타 문자가 그 것으로 해석되지 않도록 사용자의 입력을 피하지 못하는 것입니다. 이를 위해 apos.utils.regExpQuote(s)을 사용하면 위험 문자가 포함 된 문자열을 \을 통해 이스케이프 처리합니다.

더 나은 방법이 있습니다 : 대신 req.query.autocomplete을 사용하십시오. 아포스트로피에는 autocomplete 커서 필터가 search 필터와 다르게 작동합니다. autocomplete 필터는 부분 일치를 허용하지만 (단어 시작 부분에만 있음) 단어를 찾은 단어는 일반 search을 통해 전달되므로 결과는 여전히 일치 품질에 따라 정렬됩니다. 또한 search을 사용하여 많은 성능 이점을 유지합니다.

당신과 같은 정규 표현식 검색은 mongodb 컬렉션 전체 (적어도 해당 유형의 모든 문서)를 검색하므로 내용이 많은 경우 성능 문제가 발생할 수 있습니다.

autocomplete 한 가지주의해야 할 점은 그것이 단지 등의 제목, 태그, 같은 우선 순위가 높은 분야의 단어 그것은 문서 방식의 전체 텍스트를 볼 수 없습니다 "본다"고 귀하의 정규식 검색 (또는 search 필터) 수 . 이것은 성능을 유지하기 위해 필요한 절충안이었습니다. "블루"의 부분 문자열을 검색하는 내 테스트에서

0

RegExp를 추가하는 것처럼 보이는 것이 필요합니다. 당신은 내가 P'unk 번가에서 아포스트로피의 리드 개발자입니다 알다시피

module.exports = { 
    perPage: 15, 
    construct: function(self, options) { 
    self.indexPage = function(req, callback) { 

     req.query.search = req.query.search || req.query.q; 
     var allowedTypes; 

     var defaultingToAll = false; 
     var cursor = self.apos.docs.find(req, { lowSearchText: new RegExp(req.query.search, 'i') }) 
      .perPage(self.perPage); 
      if (self.filters) { 
      var filterTypes = _.filter(
       _.pluck(self.filters, 'name'), 
       function(name) { 
        return name !== '__else'; 
       } 
      ); 
관련 문제