我试图查询我的数据库,以编译一个位置附近的帖子列表,该位置是给定用户已经/不喜欢的。
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
}
2条答案
按热度按时间zengzsys1#
您最初的解决方案对我来说是有意义的,尽管对延迟的担忧可能被证明是有效的。您研究过关系数据源吗?在这一点上,它只支持aurora serverless,因此您对sql的评论将是这里的情况,使用它内置的地理空间数据类型,而不是elasticsearch。
您可以通过这种方式完全用rds构建模式,从而消除对管道的需求。使用连接的复杂sql查询可以基于位置构建文章组合,而不是由三部分组成。
5fjcxozz2#
我不确定你的绩效要求是什么,但我认为你最初的计划应该是可以的,如果:
1) 获取用户位置附近所有帖子的列表(ElasticSearch)
如果elasticsearch索引设置了正确的Map、大小、分片和硬件取决于数据大小,那么这应该很快。
2) 查询likes表,获取我所做的所有likes(dynamodb)
这可能很快,以防您可能有一个“likes”的内存缓存,要么是完全内存缓存,要么是lazy/lru缓存。
3) 逐项合并结果。
如果结果大小不是太大(使用10-100个项目的页面?),那么从elasticsearch获取响应,在该流上运行并基于内存字典对其进行丰富/过滤应该是可以的。
祝你好运!