如何从 Amplify - AppSync - ElasticSearch - DynamoDB Stack 中获取看不见的附近文档?

Posted

技术标签:

【中文标题】如何从 Amplify - AppSync - ElasticSearch - DynamoDB Stack 中获取看不见的附近文档?【英文标题】:How to get unseen, nearby documents from a Amplify - AppSync - ElasticSearch - DynamoDB Stack? 【发布时间】:2019-10-19 03:58:25 【问题描述】:

问题: 使用 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" : "$distancekm",
                 "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 个。 用户喜欢的越多,通话的时间就越长。

【问题讨论】:

没有***.com/a/56268132/3892213回答你的问题吗? How does Tinder know who's been seen? (Backend)的可能重复 并非如此。在这个答案中,我们忽略了可能有新用户。它没有在 dynamodb 中排序。因此,如果我保存已查看用户的数量,那么我可能会发现新用户不在其中?! 不是重复的,它更多的是关于我当前堆栈的这个旧问题的问题。因为我必须使用elasticsearch 【参考方案1】:

@searchable 指令目前不支持开箱即用的自定义 ElasticSearch 映射,因此您需要为 ElasticSearch 集群执行一些自定义设置。您应该能够使用诸如 hasChild 之类的连接查询来查找在同一索引中没有关联子记录的所有位置,这些位置表明用户之前曾与作业进行过交互。

在撰写本文时,@searchable 指令将不同的 @model 存储在单独的索引中,因此您需要编写一个自定义解析器,将“交互”子记录放在指定用户何时与作业交互的同一索引中,以及那么您将需要更新 ES 索引映射,使其使用连接数据类型,以便您可以使用 hasChild 查询。请参阅https://www.elastic.co/guide/en/elasticsearch/reference/current/parent-join.html 了解更多信息。

【讨论】:

以上是关于如何从 Amplify - AppSync - ElasticSearch - DynamoDB Stack 中获取看不见的附近文档?的主要内容,如果未能解决你的问题,请参考以下文章

AppSync/Amplify - 如何定义 GraphQL 订阅

AWS- Amplify - Appsync:使用 CLI 从 Android 应用程序更改云资源时,正确的工作流程是啥?

如何将 Amplify 配置为使用多个 AppSync 端点?

如何删除并重新创建由 mock api 创建的本地 dynamodb/appsync/amplify 数据库?

将现有 AppSync API 与/ Amplify 一起使用

在 React 中使用 AWS Amplify Appsync 上传图像