near
定義
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
では、次の用語を使用してクエリを作成します。
フィールド | タイプ | 説明 | 必要性 | |||
---|---|---|---|---|---|---|
origin | 日付、数値、または地理的 | 近くの検索する数値、日付、または地理的ポイント。 これは、結果の近接性が測定されるオリジンです。
| はい | |||
path | 文字列または複数の文字列の配列 | インデックス付きフィールドまたは検索するフィールド。 「パス構築 」を参照してください。 | はい | |||
pivot | 数値 | Atlas Search 結果ドキュメントのスコアを計算するために使用する値。 スコアは、次の式を使用して計算されます。
上記で、 結果のインデックス フィールド値が
| はい | |||
score | オブジェクト | 一致する検索結果に割り当てる スコア 。 デフォルトのスコアは、次のオプションを使用して変更できます。
クエリで 詳しくは、「スコアリング動作 」を参照してください。 | 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 クラスターにサンプル データ をロードすると、以下の例のインデックス定義または 動的インデックス を使用して静的インデックスを作成し、クラスターでサンプル クエリを実行できます。
Tip
サンプル データセットをすでに読み込んでいる場合は、「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 }
次のクエリは、 runtime
フィールド値が279に近い値を持つmovies
コレクション内のドキュメントを検索します。 出力を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
は、 279
のruntime
フィールド値が完全一致であるため、スコア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 結果では、映画「 Regeneration
」に1
のスコアが与えられます。 1915-09-13
のreleased
フィールド値は完全一致であるためです。 1915-12-13
に公開された映画The Cheat
は、 origin
からのreleased
フィールド値の距離が1915-09-13
から約7,776,000,000
ミリ秒であるため、約0.5
のスコアを受け取ります。
GeoJSON ポイントの例
次の例では、 near
演算子を使用して、 sample_airbnb.listingsAndReviews
コレクション内の GeoJSON ポイント オブジェクトをクエリします。 address.location
property_type
次のインデックス定義は、listingsAndReviews
コレクション内の フィールドと フィールドにインデックスを作成します。
例
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
次の例では、property_type
address.location
演算子を使用して、sample_airbnb.listingsAndReviews
コレクション内の フィールドと フィールドをクエリします。
例
次のクエリは、指定された GeoJSON ポイントの近くにある香港のアパートを検索します。 クエリでは、 を使用して検索条件(満たす必要がある)を指定し、 を使用してロケーションの優先順位を指定する必要があります。 出力を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 }