如何仅进行地理距离查询 return 结果我还没有 "Liked",Elastic Search,Dynamo DB

How to make a geo distance query only return results that I have not yet "Liked", Elastic Search, Dynamo DB

我正在尝试查询我的数据库以编译某个位置附近的帖子列表,给定用户 has/hasnot 喜欢。

allPostsNearLocationUserHasLiked(
    userId: ID,
    location: LocationInput,
    radius: Int
): [Post]
allPostsNearLocationUserHasNotLiked(
    userId: ID,
    location: LocationInput,
    radius: Int
): [Post]

为此,我目前正在使用 AWSAppSync,将 dynamoDB 流数据传输到 Elastic Search。这使我能够轻松地进行地理空间搜索并获取给定位置附近的所有帖子。

我想知道使用 dynamoDB 进行计算的最有效方法是什么?还是为我的 likes/users 切换到 SQL 数据库更适合我?

我有一个用户、帖子和喜欢的 DynamoDB table。我正在考虑使用管道解析器来:

1) 获取用户位置附近的所有帖子的列表(弹性搜索)

2) 查询点赞数table, 得到我点过的所有点赞数(DynamoDB)

3) 逐项合并结果。

我严重怀疑这个操作的性能,尤其是第 3 步,它是一个 O(M*N) 操作。

有没有什么方法可以在 Elastic Search 中本地完成整个查询?

## DynamoDB Table?? Or maybe SQL?
type Like {
    likeId: ID!
    userId: ID!
    likedPostId: ID!
}

type Query {
    #Implement with Elastic Search
    allPostsNearLocation(location: LocationInput, radius: Int): [Post]

    ## Elastic search??? 
    allPostsNearLocationUserHasLiked(
        userId: ID,
        location: LocationInput,
        radius: Int
    ): [Post]
    allPostsNearLocationUserHasNotLiked(
        userId: ID,
        location: LocationInput,
        radius: Int
    ): [Post]
}

type Location {
    lat: Float!
    lon: Float!
}

input LocationInput {
    way: Float!
    lon: Float!
}

type Mutation {
    putPost(
        author: String!,
        title: String!,
        content: String!,
        location: LocationInput!,
        url: String!
    ): Post
    putUser(name:String): User

    likePost(userId: ID!, postId: ID!): Like
}

#DynamoDB Table
type User{
    userId: ID!
    name: String
    likes: [Like]
}

#DynamoDB table
type Post {
    id: ID!
    author: String!
    title: String!
    content: String!
    url: String!
    location: Location!
}

schema {
    query: Query
    mutation: Mutation
}

你最初的解决方案对我来说很有意义,尽管对延迟的担忧可能是有道理的。你调查过 relational data sources 了吗?在这一点上,它只支持 Aurora Serverless,所以你关于 SQL 作为替代方案的评论就是这里的情况,使用它内置的地理空间数据类型而不是 Elasticsearch 的数据类型。

您可以通过这种方式完全在 RDS 中构建架构,从而消除对管道的需求。使用联接的复杂 SQL 查询可以根据位置构建您的帖子组合,而不是分三部分完成。

我不确定你的性能要求是什么,但我认为你的初始计划应该没问题,如果:

1) Get the list of all the posts near a users location (Elastic Search)

如果使用正确的映射、大小、分片和硬件设置 Elasticsearch 索引,这应该很快。

2) Query the likes table, to get all the likes I have made (DynamoDB)

如果您有 'likes' 的内存缓存,或者完全在内存中,或者 lazy/LRU 缓存,这可能会很快。

3) Combine the results item by item.

如果结果大小不太大(使用 10-100 个项目的页面?),然后从 Elasticsearch 获取响应,运行 在那个流上 enriching/filtering 它基于一个 in内存字典应该没问题。

祝你好运!