如何进行地理距离查询,仅返回我尚未“喜欢”,Elastic Search,Dynamo DB的结果

泽茨

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

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

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

我想知道最有效的方法是使用dynamoDB进行计算吗?还是更适合我的喜欢/用户使用SQL数据库?

我有一个Users,posts和Likes DynamoDB表。我当时在考虑使用管道解析器执行以下操作:

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

2)查询点赞表,以获取我的所有点赞(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
}
Opster Elasticsearch专家

我不确定您对性能的要求是什么,但如果出现以下情况,我认为您的初始计划应该可以

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

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

2)查询点赞表,以获取我的所有点赞(DynamoDB)

如果您可以在内存中拥有“喜欢”的高速缓存(完全在内存中或在惰性/ LRU高速缓存中),这可以很快。

3)逐项组合结果。

如果结果的大小不是太大(使用10-100个项目的页面?),那么从Elasticsearch获取响应,在该流上运行并根据内存字典丰富/过滤它,应该可以。

祝好运!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章