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。