OpenSearch支援類似附近人或地點的搜尋。可以按照地點或附近人傳入的座標,提高搜尋效率,同時提供排序功能。本文介紹了其配置方式。
解決方案
-
配置GEO_POINT類型的應用結構欄位以及地理位置索引,用於檢索和召回結果。
-
GEO_POINT類型的欄位設定資料來源處理外掛程式。
-
搜尋測試文法介紹,添加排序功能介紹。
配置步驟
-
建立應用結構配置
在OpenSearch應用結構表中增加lon和lat的DOUBLE類型地理位置座標,再建立一個GEO_POINT類型的company_lon_lat欄位(欄位名稱自訂)。在索引結構定義中,為company_lon_lat設定分析器為地理位置分析器,並添加為屬性欄位。 在應用結構中添加欄位 lon(資料類型為 DOUBLE)、lat(資料類型為 DOUBLE)和 company_lon_lat(資料類型為 GEO_POINT)。 在索引欄位列表中,新增索引名稱為 company_lng_lat,包含欄位設定為 company_lon_lat,分析方式選擇地理位置分析。在屬性欄位列表中,找到 company_lon_lat 欄位,單擊添加為屬性欄位,使該欄位可在 filter、aggregate、sort、distinct 子句中使用。完整建立應用流程請參見快速搭建應用。
-
資料來源配置
欄位對應時,將company_lon_lat這個應用結構欄位配置StringCatenateExtractor外掛程式,將現有的經度欄位lon和緯度欄位lat,聯合起來。通過空格串連,產生到目標欄位company_lon_lat。
在欄位串連符輸入框中直接打出空格即可。
注意:目標欄位company_lon_lat的映射欄位可忽略。
外掛程式具體說明請參見資料來源外掛程式說明。
介面中目標欄位company_lon_lat的映射欄位留空,無需配置映射關係。
-
搜尋測試
樣本: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範圍查詢。
-
新增精排運算式
樣本:(distance(company_lon_lat,long_lat_in_query,distance)+1))*10000。
功能:按距離遠近將召回的文檔進行排序。
文法: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。