spring - 如何使用Spring Data Redis存储库指定geo radius命令附加参数?

标签 spring redis spring-data spring-data-redis

我正在使用Spring Data Redis保存一些地址,每个地址都包含location类型的Point属性,该属性保存特定地址的地理坐标。另外,该属性用@GeoIndexed注释。就像这里描述的一样:Geospatial Index

我的Address模型如下所示:

@RedisHash("addresses")
public class Address {    
    @Id
    private String id;    

    @GeoIndexed
    private Point location;    
}

通过此存储库查询,我能够将所有附近的地址获取到给定的点和距离:
public interface AddressRepository extends CrudRepository<Address, String> {
    List<Address> findByLocationNear(Point location, Distance distance);
}

我的问题是上述查询返回的地址未排序,但我需要将它们从最近到最远进行排序(此处描述的ASC选项:GEORADIUS - Redis Command)。

因此,通常,我需要一种将其他参数传递给此查询的方法,例如对结果进行排序或限制(GEORADIUS - Redis Command的任何选项)。

有人可以帮忙吗?

最佳答案

您可以通过使用GeoOperations类实现解决方案来绕过此问题。

这样,您可以使用RedisGeoCommands.GeoRadiusCommandArgs.limit(n),并且可以将结果数限制为前n个匹配项。

在此处查看Spring Data Redis的官方文档:GeoRadiusCommandArgs

您还可以在Spring Data Redis测试中直接找到一些示例。

更新:

这是我通过实现新的service方法而不是repository所得到的最终代码:

public class AddressService {
    private final StringRedisTemplate stringRedisTemplate;

    public AddressService(StringRedisTemplate stringRedisTemplate) {
        this.stringRedisTemplate = stringRedisTemplate;
    }

    public List<Address> findByLocationNear(Point location, Distance distance) {
        Circle within = new Circle(location, distance);
        GeoRadiusCommandArgs args = GeoRadiusCommandArgs.newGeoRadiusArgs().sortAscending().limit(10);

        GeoOperations<String, String> geoOperations = stringRedisTemplate.opsForGeo();
        GeoResults<GeoLocation<String>> nearbyLocations = geoOperations.radius("addresses:location", within, args);

        // Convert geo results into addresses
        List<Address> addresses = ...;

        return addresses;
    }
}

关于spring - 如何使用Spring Data Redis存储库指定geo radius命令附加参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61108782/

相关文章:

java - 来自 Windows Server Spring 集成的 SFTP

java - Spring 框架 - 与旧 Java web 应用程序集成

java - 如何在 Swagger-UI "Value"字段中仅显示必需的参数

node.js - 如何从redis中的值中获取键并通过检查其值删除其他键?

spring - Spring Data Elasticsearch Repository查询定义日期输入参数格式

java - OpenMQ超时后消息丢失

java - 为什么我的项目中EhCache还在下载和初始化

asynchronous - 我可以将 async 和 wait 与 Tornado-redis 一起使用吗? (Python 3.5)

java - Spring Data Redis 1.7.2.RELEASE,注入(inject)RedisOperations而不是RedisTemplate

java - 按馆藏规模排名前 5 的记录