Проблема: используйте 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. Чем больше лайков пользователю, тем дольше будет идти этот звонок.