Как сделать так, чтобы запрос географического расстояния возвращал только те результаты, которые мне еще не понравились, Elastic Search, Dynamo DB - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь сделать запрос в моей базе данных, чтобы составить список постов рядом с местоположением, которое данному пользователю понравилось / не понравилось.

allPostsNearLocationUserHasLiked(
    userId: ID,
    location: LocationInput,
    radius: Int
): [Post]
allPostsNearLocationUserHasNotLiked(
    userId: ID,
    location: LocationInput,
    radius: Int
): [Post]

Для этого я в настоящее время использую AWSAppSync с потоковой передачей данных DynamoDB в Elastic Search.Это позволяет мне легко выполнять геопространственный поиск и получать все сообщения рядом с заданным местоположением.

Мне интересно, какой самый эффективный способ - вычислить это с помощью DynamoDB?Или было бы лучше для меня переключиться на базу данных SQL для моих лайков / пользователей?

У меня есть таблица DynamoDB Users, posts и Likes.Я думал об использовании преобразователя конвейера для:

1) Получить список всех сообщений рядом с местоположением пользователя (Elastic Search)

2) Запросить таблицу лайков, чтобы получить вселайки, которые я сделал (DynamoDB)

3) Объединить результаты по элементам.

У меня есть серьезные сомнения относительно эффективности этого особенно шага 3, который является операцией O (M * N),

Есть ли способ выполнить весь этот запрос в Elastic Search?

## DynamoDB Table?? Or maybe SQL?
type Like {
    likeId: ID!
    userId: ID!
    likedPostId: ID!
}

type Query {
    #Implement with Elastic Search
    allPostsNearLocation(location: LocationInput, radius: Int): [Post]

    ## Elastic search??? 
    allPostsNearLocationUserHasLiked(
        userId: ID,
        location: LocationInput,
        radius: Int
    ): [Post]
    allPostsNearLocationUserHasNotLiked(
        userId: ID,
        location: LocationInput,
        radius: Int
    ): [Post]
}

type Location {
    lat: Float!
    lon: Float!
}

input LocationInput {
    way: Float!
    lon: Float!
}

type Mutation {
    putPost(
        author: String!,
        title: String!,
        content: String!,
        location: LocationInput!,
        url: String!
    ): Post
    putUser(name:String): User

    likePost(userId: ID!, postId: ID!): Like
}

#DynamoDB Table
type User{
    userId: ID!
    name: String
    likes: [Like]
}

#DynamoDB table
type Post {
    id: ID!
    author: String!
    title: String!
    content: String!
    url: String!
    location: Location!
}

schema {
    query: Query
    mutation: Mutation
}

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Я не уверен, каковы ваши требования к производительности, но я думаю, что ваш первоначальный план должен быть в порядке, если:

1) Получить список всех сообщений рядом с местоположением пользователя (Elastic Search)

Это должно быть быстрым, если индекс Elasticsearch настроен с правильным отображением, размер, шардинг и аппаратные средства зависят от размера данных.

2) Запрос к таблице лайков, чтобы получить все лайки, которые я сделал (DynamoDB)

Это может быть быстро, если у вас может быть кеш в памяти «лайков», либо полностью в памятиили ленивый / LRU кеш.

3) Объедините элемент результатов по элементам.

, если размер результата не слишком велик (используйте страницы из 10-100 элементов?), затем получит ответ от Elasticsearch, запустит этот поток и обогатит / отфильтрует его по словарю в памяти.

Удачи!

0 голосов
/ 13 января 2019

Ваше первоначальное решение имеет смысл для меня, хотя опасения по поводу задержки могут оказаться обоснованными.Вы изучили реляционные источники данных ?На данный момент он поддерживает только Aurora Serverless, поэтому ваш комментарий о SQL в качестве альтернативы можно использовать здесь, используя встроенные гео-пространственные типы данных вместо типов Elasticsearch.

Вы можете создатьСхема полностью в RDS таким образом, устраняя необходимость в конвейере.Сложный SQL-запрос с использованием объединений может создать вашу комбинацию постов в зависимости от местоположения, а не выполнять работу из трех частей.

...