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