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

标签 elasticsearch amazon-dynamodb aws-amplify aws-appsync amplifyjs

问题:
使用 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
}

现在的问题是。如果我现在有 table (Jobinteract)。我也应该把它设为@searchable 吗?

然后我在 ElasticSearch 中也有数据。但是我怎样才能把它们放在一起呢?
然后是来自不同索引的数据。

我在 ES 中阅读了 hasChild。但是不明白这应该如何工作,如果它是正确的方法?!

我目前也在测试我是否可以通过 lambda 访问 ES,所以我只需调用附近的所有工作并自己比较它们。
但这可能不是最好的选择。
从 Elasticsearch 获取附近的 100 个工作,将其与下表进行比较。如果还剩 50 个,就发给前端,如果没有,再给 100 个。
用户喜欢的越多,通话时间就越长。

最佳答案

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

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

关于elasticsearch - 如何从 Amplify - AppSync - ElasticSearch - DynamoDB Stack 中获取看不见的附近文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56430019/

相关文章:

ruby - 动态模块 : Querying tables with secondary index

node.js - 使用 Node Js 更新 Dynamo 数据库中的集合

java - java中的batchGetItem API错误

javascript - 提交包含对象播放负载嵌套数组的 graphql 突变,值为 "aws-amplify"

sql-server - ElasticSearch和Asp.net Core 2.0

json - ElasticSearch查询

android - 使用 Terraform 创建 AWS Amplify 资源

reactjs - 使用 AWS Amplify Hosting 保留查询字符串 - React

elasticsearch - 如何设置从完成/建议返回的结果数?

elasticsearch - 无法访问端口5601上的Docker容器中运行的Kibana