Как получить невидимые близлежащие документы из стека Amplify - AppSync - ElasticSearch - DynamoDB? - PullRequest
0 голосов
/ 03 июня 2019

Проблема: используйте Amplify.js из AWS.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 всех идентификаторов пользователей, которые уже видели эту работу.Пока было около 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.Но как я могу собрать их вместе?Это тогда данные из разных индексов.

Я прочитал hasChild в ES.Но не понимаю, как именно это должно работать, если это правильный путь?!


В настоящее время я также проверяю, могу ли я получить доступ к ES через лямбду, поэтому я бы просто позвонилсобери все работы поблизости и сравни их сам.Но это, вероятно, не самый лучший вариант.Получите 100 рабочих мест от Elasticsearch, сравните его с таблицей ниже.Если осталось 50, отправьте их на внешний интерфейс, если нет, получите 100 снова.Чем больше нравится пользователю, тем дольше будет длиться этот звонок.

1 Ответ

1 голос
/ 10 июня 2019

Директива @searchable в настоящее время не поддерживает настраиваемые сопоставления ElasticSearch «из коробки», поэтому вам потребуется выполнить некоторые пользовательские настройки для вашего кластера ElasticSearch.Вы должны иметь возможность использовать объединяющие запросы, такие как hasChild, чтобы найти все местоположения, в которых нет связанных дочерних записей в том же индексе, который указывает, что пользователь взаимодействовал с заданием ранее.

На момент написания @searchableДиректива хранит разные @models в отдельных индексах, поэтому вам нужно написать собственный распознаватель, который помещает дочернюю запись «Взаимодействие» в тот же индекс, который указывает, когда пользователь взаимодействовал с заданием, а затем вам нужно будет обновить сопоставление индекса ES.так что он использует тип данных соединения, чтобы вы могли использовать запрос hasChild.См. https://www.elastic.co/guide/en/elasticsearch/reference/current/parent-join.html для получения дополнительной информации.

...