Как получить невидимые близлежащие документы из стека Amplify — AppSync — ElasticSearch — DynamoDB?

Проблема: используйте 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) сейчас. Должен ли я сделать его доступным для поиска?

Тогда у меня также есть данные в ElasticSearch. Но как я могу собрать их вместе? Затем это данные из разных индексов.

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


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


person DavidBiller    schedule 03.06.2019    source источник
comment
stackoverflow.com/a/56268132/3892213 не ответили на ваш вопрос?   -  person best wishes    schedule 04.06.2019
comment
Возможный дубликат Как Tinder узнает, кого видели? (серверная часть)   -  person best wishes    schedule 05.06.2019
comment
Не совсем. В этом ответе мы игнорируем, что может быть новый пользователь. В dynamodb не сортируется. Так что, если я сохраню количество увиденных пользователей, то у меня может быть новый не там?!   -  person DavidBiller    schedule 05.06.2019
comment
Дубликат, не так ли, это скорее вопрос об этом старом вопросе с моим текущим стеком. Потому что я должен использовать elasticsearch   -  person DavidBiller    schedule 05.06.2019


Ответы (1)


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

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

person mparis    schedule 10.06.2019