附近人搜索

OpenSearch支持类似附近人或地点的搜索。如果希望按照地点或附近人传入的坐标,那么可以使用本文介绍的方式,提高搜索效率,也同时提供排序功能。

解决方案

  1. 配置GEO_POINT类型的应用结构字段以及地理位置索引,用于检索,召回结果。

  2. GEO_POINT类型的字段设置数据源处理插件。

  3. 搜索测试语法介绍,添加排序功能介绍。

配置步骤

1.创建应用结构配置

在OpenSearch应用结构表中增加lon和lat的DOUBLE类型地理位置坐标,再创建一个GEO_POINT类型的company_lon_lat字段(字段名称自定义) 。索引结构定义中,为company_lon_lat设置分析器为地理位置分析器,并添加为属性字段。123完整创建应用流程请参考文档:快速搭建应用

2.数据源配置

字段映射时,将company_lon_lat这个应用结构字段配置StringCatenateExtractor插件,将现有的经度字段lon和纬度字段lat,联合起来。通过空格联合,生成到目标字段company_lon_lat。

4

注意:目标字段company_lon_lat的映射字段可忽略:

5

插件具体说明请参考文档:数据源插件说明

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