가깝다
정의
near
near
연산자는 숫자, 날짜 및 GeoJSON 포인트 값을 쿼리하고 점수를 매기는 기능을 지원합니다. 이 연산자를 사용하여 검색을 수행할 수 있습니다:BSON
int32
,int64
및double
데이터 유형의 숫자 필드.ISODate 형식인 BSON
date
유형의 날짜 필드입니다.위도 및 경도 좌표를 사용하여 정의된 지리적 위치 필드입니다.
near
연산자를 사용하면 숫자나 날짜에 가까운 결과를 찾을 수 있습니다.near
연산자는 숫자나 날짜에 대한 근접성을 기준으로 Atlas Search 결과에 점수를 매깁니다.
구문
near
의 구문은 다음과 같습니다:
{ $search: { "index": <index name>, // optional, defaults to "default" "near": { "path": "<field-to-search>", "origin": <date-or-number>, "pivot": <pivot-distance>, "score": <score-options> } } }
옵션
near
는 다음 용어를 사용하여 쿼리를 구성합니다:
필드 | 유형 | 설명 | 필요성 | |||
---|---|---|---|---|---|---|
| 날짜, 번호, 또는 지역 | 네 | ||||
| 문자열 또는 문자열 배열 | 인덱싱된 필드 또는 검색할 필드입니다. 경로 구성을 참조하세요. | 네 | |||
| 숫자 | Atlas Search 결과 문서의 점수를 계산하는 데 사용되는 값입니다. 점수 계산에는 다음 공식이 사용됩니다.
여기서 인덱스 필드 값이
| 네 | |||
| 객체 | 일치하는 검색어 결과에 할당할 점수입니다. 다음 옵션을 사용하여 기본 점수를 수정할 수 있습니다.
쿼리에서 | no |
채점 동작
Atlas Search score
는 Atlas Search 결과가 origin
에 얼마나 근접한지를 측정한 값입니다. score
값은 0
~1
로 조정되며, 1
값은 정확히 일치하는 항목이고 0
값은 원거리 일치 항목입니다. origin
에서의 Atlas Search 결과 거리가 pivot
을 사용하여 계산한 원점으로부터의 거리와 같을 때 점수는 0.5
입니다.
점수 계산에는 다음 공식이 사용됩니다.
pivot score = ------------------ pivot + distance
여기서 distance
와 origin
은 인덱스 필드 값의 차이입니다.
쿼리에서 score
옵션을 사용하여 기본 점수를 수정할 수 있습니다. 옵션에 대해 자세히 알아보려면 점수 수정을 참조하세요.
제한 사항
Atlas Search 인덱스가 있더라도 near
연산자를 사용하여 배열에 저장된 숫자 또는 날짜 값을 쿼리할 수 없습니다. 범위 연산자는 배열 내의 인덱싱된 숫자 또는 날짜 값을 쿼리하는 데만 사용할 수 있습니다.
예시
숫자 및 날짜 예제에서는 sample_mflix
데이터베이스의 movies
컬렉션을 사용합니다. GeoJSON 포인트 예제에서는 sample_airbnb
데이터베이스의 listingsAndReviews
컬렉션을 사용합니다.
Atlas 클러스터에 샘플 데이터를 로드하는 경우, 아래 예시의 인덱스 정의 또는 동적 인덱스를 사용하여 정적 인덱스를 생성하고 클러스터에서 예시 쿼리를 실행할 수 있습니다.
팁
샘플 데이터 집합을 이미 로드한 경우, Atlas Search 시작하기 자습서에 따라 인덱스 정의를 만들고 Atlas Search 쿼리를 실행하세요.
번호 예시
다음 예에서는 near
연산자를 사용하여 숫자 필드를 쿼리합니다.
예시
runtimes
라고 명명된 다음 인덱스 정의는 movies
컬렉션에서만 runtime
필드의 인덱스를 생성합니다.
1 { 2 "mappings": { 3 "dynamic": false, 4 "fields": { 5 "runtime": { 6 "type": "number" 7 } 8 } 9 } 10 }
다음 쿼리는 movies
컬렉션에서 runtime
필드 값이 279 근처에 있는 문서를 검색합니다. 여기에는 출력 결과를 7 개로 제한하는 $limit
단계와 $project
단계가 포함되어 있습니다.
title
및runtime
을 제외한 모든 필드를 제외합니다.다음과 같은 이름의 필드를 추가합니다.
score
score
는 pivot
를 사용하여 계산됩니다.
1 db.movies.aggregate([ 2 { 3 $search: { 4 "index": "runtimes", 5 "near": { 6 "path": "runtime", 7 "origin": 279, 8 "pivot": 2 9 } 10 } 11 }, 12 { 13 $limit: 7 14 }, 15 { 16 $project: { 17 "_id": 0, 18 "title": 1, 19 "runtime": 1, 20 score: { $meta: "searchScore" } 21 } 22 } 23 ])
위의 쿼리는 다음과 같은 결과를 반환합니다:
1 { "runtime" : 279, "title" : "The Kingdom", "score" : 1 } 2 { "runtime" : 279, "title" : "The Jinx: The Life and Deaths of Robert Durst", "score" : 1 } 3 { "runtime" : 280, "title" : "Shoah", "score" : 0.6666666865348816 } 4 { "runtime" : 281, "title" : "Les Misèrables", "score" : 0.5 } 5 { "runtime" : 277, "title" : "Tokyo Trial", "score" : 0.5 } 6 { "runtime" : 276, "title" : "Warriors of the Rainbow: Seediq Bale", "score" : 0.4000000059604645 } 7 { "runtime" : 283, "title" : "Scenes from a Marriage", "score" : 0.3333333432674408 }
위의 Atlas Search 결과에서 영화 The Kingdom
과 The
Jinx: The Life and Deaths of Robert Durst
는 runtime
필드 값 279
가 정확히 일치하기 때문에 1.0
점을 받습니다. 영화 Les Misèrables
과 Tokyo Trial
는 runtime
필드 값이 279
에서 2
단위 떨어져 있기 때문에 0.5
점을 받습니다.
날짜 예시
다음 예에서는 near
연산자를 사용하여 날짜 필드를 쿼리합니다.
예시
releaseddate
라고 명명된 다음 인덱스 정의는 movies
컬렉션에서만 released
필드의 인덱스를 생성합니다.
1 { 2 "mappings": { 3 "dynamic": false, 4 "fields": { 5 "released": { 6 "type": "date" 7 } 8 } 9 } 10 }
다음 쿼리는 13, 1 9월 근처에 개봉된 영화를 검색합니다. 여기에는 출력 결과를 3
개로 제한하는 $limit
단계와 $project
단계가 포함되어 있습니다.
title
및released
을 제외한 모든 필드를 제외합니다.다음과 같은 이름의 필드를 추가합니다.
score
결과의 score
는 pivot
을 사용하여 계산됩니다.
참고
pivot
여기서는 밀리초 단위로 측정되며, 7,776,000,000 ms
는 약 3개월에 해당합니다.
1 db.movies.aggregate([ 2 { 3 $search: { 4 "index": "releaseddate", 5 "near": { 6 "path": "released", 7 "origin": ISODate("1915-09-13T00:00:00.000+00:00"), 8 "pivot": 7776000000 9 } 10 } 11 }, 12 { 13 $limit: 3 14 }, 15 { 16 $project: { 17 "_id": 0, 18 "title": 1, 19 "released": 1, 20 score: { $meta: "searchScore" } 21 } 22 } 23 ])
위의 쿼리는 다음과 같은 검색 결과를 반환합니다.
{ "title" : "Regeneration", "released" : ISODate("1915-09-13T00:00:00Z"), "score" : 1 } { "title" : "The Cheat", "released" : ISODate("1915-12-13T00:00:00Z"), "score" : 0.49723756313323975 } { "title" : "Hell's Hinges", "released" : ISODate("1916-03-05T00:00:00Z"), "score" : 0.34090909361839294 }
위의 Atlas Search 결과에서 1915-09-13
의 released
값이 정확히 일치하기 때문에 영화 Regeneration
은 1
점을 받습니다. 1915-12-13
에 개봉된 영화 The Cheat
는 origin
으로부터의 released
필드 값 거리가 1915-09-13
로부터 약 7,776,000,000
밀리초이기 때문에 약 0.5
점을 받습니다.
GeoJSON 포인트 예시
다음 예에서는 near
연산자를 사용하여 sample_airbnb.listingsAndReviews
컬렉션의 GeoJSON 점 객체를 쿼리합니다. 다음 인덱스 정의는 listingsAndReviews
컬렉션의 address.location
및 property_type
필드를 인덱싱합니다.
예시
1 { 2 "mappings": { 3 "fields": { 4 "address": { 5 "fields": { 6 "location": { 7 "type": "geo" 8 } 9 }, 10 "type": "document" 11 }, 12 "property_type": { 13 "type": "string" 14 } 15 } 16 } 17 }
기본 예시
다음 예에서는 near
연산자를 사용하여 sample_airbnb.listingsAndReviews
컬렉션의 address.location
필드를 쿼리합니다.
예시
다음 쿼리는 포르투갈의 숙소를 검색합니다. 여기에는 출력 결과를 3
개로 제한하는 $limit
단계와 다음과 같은 $project 단계가 포함되어 있습니다.
name
및address
을 제외한 모든 필드를 제외합니다.다음과 같은 이름의 필드를 추가합니다.
score
결과의 score
는 pivot
을 사용하여 계산됩니다. 여기서 pivot
은 미터 단위로 측정되며 1000미터는 1킬로미터에 해당합니다.
1 db.listingsAndReviews.aggregate([ 2 { 3 "$search": { 4 "near": { 5 "origin": { 6 "type": "Point", 7 "coordinates": [-8.61308, 41.1413] 8 }, 9 "pivot": 1000, 10 "path": "address.location" 11 } 12 } 13 }, 14 { 15 $limit: 3 16 }, 17 { 18 $project: { 19 "_id": 0, 20 "name": 1, 21 "address": 1, 22 score: { $meta: "searchScore" } 23 } 24 } 25 ])
위의 쿼리는 다음과 같은 검색 결과를 반환합니다.
1 { 2 "name" : "Ribeira Charming Duplex", 3 "address" : { 4 "street" : "Porto, Porto, Portugal", 5 "suburb" : "", 6 "government_area" : "Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória", 7 "market" : "Porto", 8 "country" : "Portugal", 9 "country_code" : "PT", 10 "location" : { 11 "type" : "Point", 12 "coordinates" : [ -8.61308, 41.1413 ], 13 "is_location_exact" : false 14 } 15 }, 16 "score" : 1 17 } 18 { 19 "name" : "DB RIBEIRA - Grey Apartment", 20 "address" : { 21 "street" : "Porto, Porto, Portugal", 22 "suburb" : "", 23 "government_area" : "Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória", 24 "market" : "Porto", 25 "country" : "Portugal", 26 "country_code" : "PT", 27 "location" : { 28 "type" : "Point", 29 "coordinates" : [ -8.61294, 41.14126 ], 30 "is_location_exact" : true 31 } 32 }, 33 "score" : 0.9876177310943604 34 } 35 { 36 "name" : "Ribeira 24 (4)", 37 "address" : { 38 "street" : "Porto, Porto, Portugal", 39 "suburb" : "", 40 "government_area" : "Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória", 41 "market" : "Porto", 42 "country" : "Portugal", 43 "country_code" : "PT", 44 "location" : { 45 "type" : "Point", 46 "coordinates" : [ -8.61318, 41.14107 ], 47 "is_location_exact" : false 48 } 49 }, 50 "score" : 0.973789632320404 51 }
결과는 지정된 좌표에서 더 멀리 있는 속성의 점수가 낮다는 것을 보여줍니다.
컴파운드 예시
다음 예에서는 compound
연산자를 사용하여 sample_airbnb.listingsAndReviews
컬렉션의 property_type
및 address.location
필드를 쿼리합니다.
예시
다음 쿼리는 지정된 GeoJSON 점 근처에 있는 홍콩의 아파트를 검색합니다. 쿼리는 반드시 충족되어야 하는 Atlas Search 조건을 지정하기 위해 must를 사용하고, 위치에 대한 기본 설정을 지정하기 위해 should 를 사용합니다. 여기에는 출력 결과를 3 개로 제한하는 $limit
단계와 $project 단계가 포함되어 있습니다.
property_type
및address
을 제외한 모든 필드를 제외합니다.다음과 같은 이름의 필드를 추가합니다.
score
score
는 pivot
을 사용하여 계산됩니다. 여기서 pivot
은 미터 단위로 측정되며 1000미터는 1킬로미터에 해당합니다.
1 db.listingsAndReviews.aggregate([ 2 { 3 $search: { 4 "compound": { 5 "must": { 6 "text": { 7 "query": "Apartment", 8 "path": "property_type" 9 } 10 }, 11 "should": { 12 "near": { 13 "origin": { 14 "type": "Point", 15 "coordinates": [114.15027, 22.28158] 16 }, 17 "pivot": 1000, 18 "path": "address.location" 19 } 20 } 21 } 22 } 23 }, 24 { 25 $limit: 3 26 }, 27 { 28 $project: { 29 "_id": 0, 30 "property_type": 1, 31 "address": 1, 32 score: { $meta: "searchScore" } 33 } 34 } 35 ])
위의 쿼리는 다음과 같은 검색 결과를 반환합니다.
1 { 2 "property_type" : "Apartment", 3 "address" : { 4 "street" : "Hong Kong, Hong Kong Island, Hong Kong", 5 "suburb" : "Central & Western District", 6 "government_area" : "Central & Western", 7 "market" : "Hong Kong", 8 "country" : "Hong Kong", 9 "country_code" : "HK", 10 "location" : { 11 "type" : "Point", 12 "coordinates" : [ 114.15027, 22.28158 ], 13 "is_location_exact" : true 14 } 15 }, 16 "score" : 1.177286982536316 17 } 18 { 19 "property_type" : "Apartment", 20 "address" : { 21 "street" : "Hong Kong, Hong Kong Island, Hong Kong", 22 "suburb" : "Central & Western District", 23 "government_area" : "Central & Western", 24 "market" : "Hong Kong", 25 "country" : "Hong Kong", 26 "country_code" : "HK", 27 "location" : { 28 "type" : "Point", 29 "coordinates" : [ 114.15082, 22.28161 ], 30 "is_location_exact" : true 31 } 32 }, 33 "score" : 1.1236450672149658 34 } 35 { 36 "property_type" : "Apartment", 37 "address" : { 38 "street" : "Hong Kong, 39 Hong Kong Island, Hong Kong", 40 "suburb" : "Mid-Levels", 41 "government_area" : "Central & Western", 42 "market" : "Hong Kong", 43 "country" : "Hong Kong", 44 "country_code" : "HK", 45 "location" : { 46 "type" : "Point", 47 "coordinates" : [ 114.15007, 22.28215 ], 48 "is_location_exact" : true 49 } 50 }, 51 "score" : 1.114811897277832 52 }