OpenSearch支援類似附近人或地點的搜尋。如果希望按照地點或附近人傳入的座標,那麼可以使用本文介紹的方式,提高搜尋效率,也同時提供排序功能。
解決方案
配置GEO_POINT類型的應用結構欄位以及地理位置索引,用於檢索,召回結果。
GEO_POINT類型的欄位設定資料來源處理外掛程式。
搜尋測試文法介紹,添加排序功能介紹。
配置步驟
1.建立應用結構配置
在OpenSearch應用結構表中增加lon和lat的DOUBLE類型地理位置座標,再建立一個GEO_POINT類型的company_lon_lat欄位(欄位名稱自訂) 。索引結構定義中,為company_lon_lat設定分析器為地理位置分析器,並添加為屬性欄位。

完整建立應用流程請參考文檔:快速搭建應用
2.資料來源配置
欄位對應時,將company_lon_lat這個應用結構欄位配置StringCatenateExtractor外掛程式,將現有的經度欄位lon和緯度欄位lat,聯合起來。通過空格聯合,產生到目標欄位company_lon_lat。

注意:目標欄位company_lon_lat的映射欄位可忽略:

外掛程式具體說明請參考文檔:資料來源外掛程式說明
3.搜尋測試
例如:query=name:'Alibaba' AND company_lon_lat:'circle(116.5806 39.99624, 1000)'說明:表示查詢公司名為Alibaba,並且在座標’116.5806 39.99624’附近1000米(1公裡)以內的文檔。文法:query=spatial_index:'circle(LON LAT,Radius)'
LON表示經度,LAT表示緯度,Radius為半徑,單位米;半徑10公裡內效能最佳,超過10公裡效能會大幅變差。
具體功能及文法可參考文檔:Range範圍查詢
4.新增精排運算式
其中距離排序也可以採用如下方式實現,使用者座標通過kvpairs傳遞:
kvpairs=longtitude_in_query:120.34256, latitude_in_query:30.56982
精排運算式為:
-distance(longitude_in_doc,latitude_in_doc,longtitude_in_query, latitude_in_query, distance_value)
文法說明:
distance(location1, location2, outputname, defaultvalue)
參數說明:
location1: GEO_POINT類型的欄位名稱
location2: 使用者查詢串中kvpairs字句中設定的一個欄位名,值為GEO_POINT欄位要求的格式:LON LAT
outputname:如果需要在結果中返回距離值,可以通過制定outputname值得到,如果不需要,可以不指定。
defaultvalue: 用於指定當文檔中location1的值非法時,distance返回的距離值,可以不指定,不指定時預設返回100000
說明:樣本中long_lat_in_query需要在kvpairs中設定,例如:kvpairs=long_lat_in_query:120.34256 30.56982