Squeak.ru - шаблоны программирования

Поиск ближайших регионов по названию в MongoDB

Я хотел бы реализовать предложения автозаполнения для регионов, близких к пользователю. Таким образом, для пользователя, находящегося в Сан-Франциско, который входит на Юнион-сквер, он может предложить Юнион-сквер, Сан-Франциско, а затем Юнион-сквер, Нью-Йорк. Это поддерживается таблицей регионов, которая включает имя, центр тяжести и геометрию. Размер таблицы будет около 500 тыс. записей со стандартным (лексическим) индексом по имени и индексом 2dsphere по центроиду. Как мне реализовать это производительным способом?

Используя приведенный ниже запрос, MongoDB, похоже, всегда использует геопространственный индекс, в результате чего время работы составляет 1 с.

{
    "name": {
        "$regex": "^Union Sq"
    },
    "centroid": { 
        "$near": {
            "$geometry": { "type": "Point", "coordinates": [-122.39986, 37.75716] }
        }
    }
}

Если я ограничу результаты радиусом 100 миль, используя $maxDistance, производительность значительно возрастет, но тогда мне понадобится система для создания вторичного неэффективного запроса с использованием $minDistance, если пользователь нацелился на более отдаленный регион. Я полагаю, что мог бы реализовать пользовательский интерфейс так, чтобы вторичные запросы были чисто лексическими, что позволило бы пользователю в конечном итоге находить удаленные регионы после того, как они ввели достаточное количество названий регионов, но близкая сортировка по этим именам была бы идеальной.

Используя приведенный ниже запрос, MongoDB, кажется, работает довольно хорошо, если предложения близки, но когда ему нужно извлекать данные из других регионов, чтобы удовлетворить ограничение, производительность несколько снижается.

regions = await Region.aggregate([
    {
        $geoNear: {
            near: {
                type: "Point", coordinates: [-122.39986, 37.75716]
            },
            key: "centroid",
            distanceField: "dist.calculated",
            query: {
                name: { $regex: '^Union Sq' }
            }
        }
    },
    { $limit: 5 }
]);

Есть лучший способ сделать это? Второстепенные вопросы включают:

  • Можно ли заставить MongoDB сначала использовать лексический индекс, а затем сортировать эти результаты географически? MongoDB, кажется, всегда использует геоиндекс, независимо от того, что в первом запросе выше.
  • Это, конечно, не критично, но в идеале я хотел бы использовать сортировку с использованием фактической геометрии вместо центроида для более точных результатов... Можно ли это сделать производительным способом?
26.07.2020

Ответы:


1

Не уверен, что есть лучшее решение для MongoDB, но я только что перенес данные в Postgres, и первый запрос, приведенный выше, был молниеносным... не говоря уже о множестве других преимуществ (например, MongoDB очень требователен к полигонам). Также полезная ссылка для тех, кто попал в такую ​​же ситуацию:

https://postgis.net/workshops/postgis-intro/knn.html

27.07.2020
Новые материалы

Очистить файлы Program .cache в Ubuntu 20.10
Очистите кеш за несколько простых шагов! GNU / Linux реализовал эффективное управление хранилищем для своих пользователей. Но заметили ли вы, что в вашей системе Linux заканчивается место,..

Использование Node.js для чтения действительно больших файлов (часть 1)
В этом сообщении в блоге есть интересный источник вдохновения. На прошлой неделе кто-то на одном из моих каналов в Slack опубликовал тестовое задание, которое он получил на должность..

Введение в градиентный спуск и обратное распространение
Введение в градиентный спуск и обратное распространение Как машинное обучение? Машинное обучение ( ML ) - это исследование компьютерных алгоритмов, которые автоматически улучшаются по..

Шаблон CQRS — C#
Этот архитектурный шаблон в основном говорит о том, что мы можем использовать одну модель для операций чтения, а другую — для операций записи. Звучит хорошо, но реализовать его может быть..

Освоение функций потерь в машинном обучении для регрессии: полное руководство по оптимизации…
Введение: Функция потерь является важным компонентом алгоритмов машинного обучения и статистических моделей. Его роль заключается в измерении несоответствия между прогнозируемым выходом модели и..

10 языков программирования, которые изменят мир в 2023 году
Мир программирования постоянно развивается, и востребованные языки постоянно меняются. Однако есть несколько языков, которые выдержали испытание временем и по-прежнему очень ценны для изучения в..

Чем заняться в наших библиотеках (апрель 2023 г.)
В апреле этого года мы празднуем обучение по-разному — от принятия позитивного и устойчивого мышления до понимания и сохранения местных популяций пчел, а также изучения новейших и новейших..