2016-09-30 4 views
1

사용자가 일부 레스토랑을 검색 할 수있는 검색 기능을 연구 중입니다. 시나리오는 다음과 같습니다.몽구스는 텍스트 색인을 사용하여 위도와 경도 정보를 기준으로 문서를 정렬합니다.

위도와 경도 정보가있는 여러 위치가있는 레스토랑 컬렉션이 있습니다. 검색 중

사용자의 위치 정보 (위도와 경도 포함)가 있습니다. 따라서 가장 가까운 곳에서 가까운 곳까지 사용자 위치를 기준으로 레스토랑을 정렬해야하며 텍스트 인덱스로 색인 된 필드의 콘텐츠를 텍스트 검색해야합니다.

결과에 대한 점수 산정을 위해 집계 파이프 라인과 프로젝션을 사용하고 있으므로 검색 시나리오가 다릅니다. 누군가 내가 시작할 수있는 곳에서 나에게 제안 할 수 있습니까?

미리 감사드립니다. 단계 아래

+0

MongoDB를의 사용 geonear 쿼리를 참조하십시오. –

답변

0

시도 :

1 단계 :

이 스키마에 위치 필드를 추가하고에 2dsphere 색인을 만들 수 있습니다.

location: { type: [Number], index: '2dsphere' } 

또한 동적 색인을 만들 수 있습니다

db.collection.createIndex({ <location field> : "2dsphere" }) 

2 단계

이제 $ geoNear로 집계 쿼리를 만들 : 당신이 어떤 조건을 통과 할 수

var aggregateQuery = [{ 
     "$geoNear": { 
      "near": { 
       "type": "Point", 
       "coordinates": [options.longitude, options.latitude] 
      }, 
      "distanceField": 'dis', 
      "distanceMultiplier": .001, 
      "spherical": true, 
      "query": **conditions** 
     } 
    }]; 

을 검색어 매개 변수

db.collectionname.aggregate(aggregateQuery).exec(function(err, result){ 
// use result here 
}) 

참고 : 경도 위치 배열의 첫번째 다음 위도를 저장해야합니다. 자세한 내용은

은이 링크를 참조 :이 도움이 https://docs.mongodb.com/manual/reference/command/geoNear/

희망!

UPDATE은 :

db.collectionname.aggregate([ 
    {$match: { 
     $text: {$search: "text"} , 
     location: {$geoWithin: {$centerSphere: [[ longitude, latitude], points]}} 
    }}]) 

참고 : 지리 인덱스가 사용되지 않습니다!

대한 추가 정보를 원하시면이 링크 http://docs.mongodb.org/manual/reference/operator/query/geoWithin/

+0

감사합니다. 그러나이 방법을 사용할 수 없습니다. $ textSearch와 함께 집계 파이프 라인을 사용하고 있습니다. mongo doc에 따르면 $ goNear는 집계 파이프 라인의 첫 번째 항목입니다. 같은 제한이 $ textSearch에 있습니다. $ textSearch를 사용하여 삭제할 수 없습니다. 집계 파이프 라인에서 두 가지 방법을 모두 사용할 수 있습니까? –

+0

@varun 업데이트를 확인하십시오. – Sachin