如何使地理距离查询只返回结果,我还没有“喜欢”,ElasticSearch,迪纳摩数据库

3zwjbxry  于 2021-06-15  发布在  ElasticSearch
关注(0)|答案(2)|浏览(377)

我试图查询我的数据库,以编译一个位置附近的帖子列表,该位置是给定用户已经/不喜欢的。

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

为此,我目前正在使用awsapsync,使用dynamodb流式数据进行ElasticSearch。这使我能够轻松地进行地理空间搜索,并获得给定位置附近的所有帖子。
我想知道什么是最有效的方法是计算这个使用dynamodb?或者对于我来说,切换到sql数据库以满足我的喜好/用户更合适吗?
我有一个用户,帖子,喜欢dynamodb表。我在考虑使用管道解析器:
1) 获取用户位置附近所有帖子的列表(ElasticSearch)
2) 查询likes表,获取我所做的所有likes(dynamodb)
3) 逐项合并结果。
我对这个特别是步骤3的性能有严重的怀疑,它是一个o(m*n)操作。
有没有办法在ElasticSearch中以本机方式完成整个查询?


## 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
}
zengzsys

zengzsys1#

您最初的解决方案对我来说是有意义的,尽管对延迟的担忧可能被证明是有效的。您研究过关系数据源吗?在这一点上,它只支持aurora serverless,因此您对sql的评论将是这里的情况,使用它内置的地理空间数据类型,而不是elasticsearch。
您可以通过这种方式完全用rds构建模式,从而消除对管道的需求。使用连接的复杂sql查询可以基于位置构建文章组合,而不是由三部分组成。

5fjcxozz

5fjcxozz2#

我不确定你的绩效要求是什么,但我认为你最初的计划应该是可以的,如果:
1) 获取用户位置附近所有帖子的列表(ElasticSearch)
如果elasticsearch索引设置了正确的Map、大小、分片和硬件取决于数据大小,那么这应该很快。
2) 查询likes表,获取我所做的所有likes(dynamodb)
这可能很快,以防您可能有一个“likes”的内存缓存,要么是完全内存缓存,要么是lazy/lru缓存。
3) 逐项合并结果。
如果结果大小不是太大(使用10-100个项目的页面?),那么从elasticsearch获取响应,在该流上运行并基于内存字典对其进行丰富/过滤应该是可以的。
祝你好运!

相关问题