问题:使用 AWS 的 Amplify.js。类似 Tinder 的应用程序。在这里您可以找到附近的工作。这些可能只能看到一次。我们应该保存用户喜欢和不喜欢的内容。
我已经管理的内容:
我有这个方案:
type Query {
nearbyJobs(location: LocationInput!, km: Int): ModelJobConnection
}
type User @model {
id: ID!
name: String
interacts: [Jobinteract] @connection(name: "interactsuser")
createdAt: String
updatedAt: String
}
type Job @model @searchable {
id: ID!
name: String
location: Location
is_swiped_by: AWSJSON
interacts: [Jobinteract] @connection(name: "interactjob")
createdAt: String
updatedAt: String
}
使用@searchable,我已经建立了与 ElasticSearch 的连接。因为这似乎是在附近寻找工作的唯一途径。
现在变得棘手了。
目前我保存在字段中:is_seen_from_user 所有已经看过这个工作的用户 id。由于到目前为止大约有 1000 个用户,这没关系。
这是我的 es 查询:
"body": {
"size": 30,
"sort": [
{
"createdAt": {
"order": "desc"
}
}
],
"query": {
"bool": {
"must": [
{
"range": {
"createdAt": {
"gte": "now-30d/d"
}
}
}
],
"must_not": {
"match_phrase": {
"is_swiped_by.user": "$ctx.identity.sub"
}
},
"filter": {
"geo_distance": {
"distance" : "${distance}km",
"location" : $util.toJson($ctx.args.location)
}
}
}
}
is_swiped_by.user 所以我查看了数组以查看用户是否在那里。如果是 - 跳过。
但现在我宁愿有更多用户的问题。
这意味着,我不能再将它保存到字段中。可能必须有一个新表。
type Jobinteract @model {
id: ID!
user: User! @connection(name: "interactsuser")
job: Job! @connection(name: "interactjob")
decision: Int
createdAt: String
updatedAt: String
}
现在的问题是。如果我现在有桌子(Jobinteract)。我也应该把它设为@searchable 吗?
然后我在 ElasticSearch 中也有数据。但是我怎样才能把它们放在一起呢?然后是来自不同索引的数据。
我在 ES 中阅读了 hasChild。但是不明白这应该如何工作,如果它是正确的方法?!
我目前也在测试我是否可以通过 lambda 访问 ES,所以我只需调用附近的所有工作并自己比较它们。但这可能不是最好的选择。从 Elasticsearch 获取附近的 100 个工作,将其与下表进行比较。如果还剩 50 个,就发给前端,如果没有,再给 100 个。用户喜欢的越多,通话时间就越长。