通过在生成索引时为每个文档添加纬度、经度位置信息,可以在检索时以与指定地点之间的距离作为条件对结果进行筛选。
概述
位置信息检索仅将位于以指定地点(纬度、经度)为中心的半径范围内的文档纳入检索结果。该筛选是作为使用 OpenSearch 的 geo_distance 查询的过滤器(filter)应用的,因此不会影响得分(相关度)。此外,不支持按距离进行排序。
用于存储位置信息的字段,必须在 OpenSearch 的映射(mapping)中定义为 geo_point 类型。默认情况下,location 字段已被定义为 geo_point 类型。但是,标准功能中并未提供向 location 字段写入值的处理,因此需要用户通过数据存储爬取的字段映射、脚本,或向搜索引擎注册文档的 API 等方式,自行存储位置信息。
使用方法
位置信息检索通过在检索请求中附加以下参数来指定。默认情况下可用于 location 字段。
| 参数 | 说明 |
|---|---|
geo.<fieldname>.point | 以 纬度,经度 的格式指定作为中心的地点的纬度和经度。值为十进制度数(Double 类型),用逗号分隔两个数值。例: 35.681236,139.767125 |
geo.<fieldname>.distance | 指定与中心地点之间的距离(半径)。例: 10km |
表: 请求参数
<fieldname> 指定存储位置信息的字段名。只能指定已在 query.geo.fields 中注册的字段,默认情况下为 location。如需使用其他字段,需先将其映射为 geo_point 类型,然后在 fess_config.properties 的 query.geo.fields 中以逗号分隔追加该字段。
例如,如果要检索位于纬度 35.681236、经度 139.767125(东京站附近)半径 10km 以内的文档,请在检索请求中附加以下参数。
距离单位
geo.<fieldname>.distance 的值会被解释为 OpenSearch 的距离单位。除了 km(千米)之外,还可以使用 mm、cm、m、in、ft、yd、mi(英里)、nmi(海里)等单位。如果省略单位仅指定数值,则会被视为以米为单位(例如: 500 表示 500 米)。
多重指定
如果对同一字段多次指定
geo.<fieldname>.point,则会检索位于其中任意一个地点半径范围内的文档(OR 条件)。如果针对不同字段分别指定位置信息,则只会检索满足所有条件的文档(AND 条件)。
Note
geo.<fieldname>.point 与 geo.<fieldname>.distance 必须同时指定。如果未指定 distance,则该 point 的条件将被忽略。此外,如果 point 的值不是 纬度,经度 的格式(以逗号分隔的两个数值),或无法解析为数值,则会发生错误。