檢索結(jié)果可以按跟指定點(diǎn)的距離排序:
提示 當(dāng)你可以(can)按距離排序時(shí),按距離打分(scoring-by-distance)通常是一個(gè)更好的解決方案。
GET /attractions/restaurant/_search
{
"query": {
"filtered": {
"filter": {
"geo_bounding_box": {
"type": "indexed",
"location": {
"top_left": {
"lat": 40,8,
"lon": -74.0
},
"bottom_right": {
"lat": 40.4,
"lon": -73.0
}
}
}
}
}
},
"sort": [
{
"_geo_distance": {
"location": { <1>
"lat": 40.715,
"lon": -73.998
},
"order": "asc",
"unit": "km", <2>
"distance_type": "plane" <3>
}
}
]
}
你可能想問(wèn):為什么要制定距離的單位
(unit
)呢?
用于排序的話,我們并不關(guān)心比較距離的尺度是英里,公里還是光年。
原因是,這個(gè)用于排序的值會(huì)設(shè)置在每個(gè)返回結(jié)果的 sort
元素中。
...
"hits": [
{
"_index": "attractions",
"_type": "restaurant",
"_id": "2",
"_score": null,
"_source": {
"name": "New Malaysia",
"location": {
"lat": 40.715,
"lon": -73.997
}
},
"sort": [
0.08425653647614346 <1>
]
},
...
單位
(unit
)來(lái)讓返回值的形式跟你應(yīng)用中想要的匹配。提示
地理距離排序可以對(duì)多個(gè)坐標(biāo)點(diǎn)來(lái)使用,不管(這些坐標(biāo)點(diǎn))是在文檔中還是排序參數(shù)中。 使用
sort_mode
來(lái)指定是否需要使用位置集合的最小
(min
),最大(max
)或者平均
(avg
)距離。 這樣就可以返回離我的工作地和家最近的朋友
這樣的結(jié)果了。
有可能距離只是決定返回結(jié)果排序的唯一重要因素,不過(guò)更常見(jiàn)的情況是距離會(huì)和其它因素, 比如全文檢索匹配度,流行程度或者價(jià)格一起決定排序結(jié)果。
遇到這種場(chǎng)景你需要在查詢分值計(jì)算(function_score
query)中指定方式讓我們把這些因子處理得到一個(gè)綜合分。
decay-functions中有個(gè)一個(gè)例子就是地理距離影響排序得分的。
另外按距離排序還有個(gè)缺點(diǎn)就是性能:需要對(duì)每一個(gè)匹配到的文檔都進(jìn)行距離計(jì)算。
而 function_score
請(qǐng)求,在 rescore
phase階段有可能只需要對(duì)前 n 個(gè)結(jié)果進(jìn)行計(jì)算處理。