2017-10-01 10 views
1

나는 텍스트 검색을 수행하기 위해 nodeJs Mongoose를 사용하고 있습니다.텍스트 검색 공백이 이스케이프

var mongoose = require('mongoose'); 
var config = require('../config'); 
var mongoosePaginate = require('mongoose-paginate'); 
var poiSchema = mongoose.Schema({ 
    city:String, 
    cap:String, 
    country:String, 
    address: String, 
    description: String, 
    latitude: Number, 
    longitude: Number, 
    title: String, 
    url: String, 
    images:Array, 
    freeText:String, 
    owner:String, 
}); 
poiSchema.index({'$**': 'text'}); 

poiSchema.plugin(mongoosePaginate); 
mongoose.Promise = global.Promise; 
mongoose.connect(config.database); 
module.exports = mongoose.model('Poi', poiSchema); 

여기

poiSchema.index({'$**': 'text'}); 

을 볼 수 있듯이 내 스키마 내의 모든 필드에 텍스트 인덱스를 만들 수 있습니다. 나는 용어 ​​검색 내부에 공백을 사용할 때

var term = "a search term"; 

var query = {'$text':{'$search': term}}; 
Poi.paginate(query, {}, function(err, pois) { 
    if(!pois){ 
     pois = { 
      docs:[], 
      total:0 
     }; 
    } 
    res.json({search:pois.docs,total:pois.total}); 
}); 

불행하게도,이 기간 안에 모든 단일 필드와 일치 컬렉션 내부의 모든 문서를 가져옵니다 : 나는 텍스트 검색을 수행 할 때

,이 코드를 개발 공백으로 검색을 분할하십시오.

텍스트 색인이 토크 나이저 공백으로 있다고 생각합니다.

전체 용어 검색이있는 모든 필드를 분할하지 않고 공백을 이스케이프 처리하는 방법을 알아야합니다.

공백을 \\으로 바꾸려고 시도했지만 아무 것도 변경되지 않았습니다.

누군가 나를 도울 수 있습니까?

답변

2

MongoDB는 대소 문자 구분, 구분 기호, 단어 중지 및 형태소 분석을 지원하여 문자열 내용에 대한 텍스트 검색 쿼리를 허용합니다. 검색 문자열의 용어는 기본적으로 OR로 처리됩니다. 워드 프로세서에서, $search 문자열은 MongoDB를가 구문 분석하고 텍스트 인덱스를 조회하기 위해 사용하는 용어의 문자열은

...입니다. MongoDB는 구문으로 지정되지 않은 한 용어의 논리적 OR 검색을 수행합니다.

그래서, 당신의 $search 문자열에서 적어도 하나 개의 용어가 일치하는 경우 다음 MongoDB를 해당 문서를 반환하고 MongoDB를은 (용어는 공백으로 구분 된 문자열) 모든 용어를 사용하여 검색합니다.

구문을 지정하여이 동작을 변경할 수 있습니다.이 작업은 여러 용어를 따옴표로 묶어서 수행 할 수 있습니다. 귀하의 질문에 나는 정확한 구문을 검색하려는 생각 : a search term 그래서 그 구를 이스케이프 문자열 인용 부호로 묶으십시오.

  • 을 감안할 때 이러한 문서 :

    { "_id" : ..., "name" : "search" } 
    { "_id" : ..., "name" : "term" } 
    { "_id" : ..., "name" : "a search term" } 
    
  • 다음 쿼리가 반환됩니다 ...

    // returns the third document because that is the only 
    // document which contains the phrase: 'a search term' 
    db.collection.find({ $text: { $search: "\"a search term\"" } }) 
    
    // returns all three documents because each document contains 
    // at least one of the 3 terms in this search string 
    db.collection.find({ $text: { $search: "a search term" } }) 
    

그래서, 요약 여기

은 몇 가지 예입니다 엔클로저로 "공백을 벗어남" "\"a search term\"" 대신 "a search term" 대신 이스케이프 된 문자열 인용 부호로 검색어 집합을 사용하십시오.