Медленное регулярное выражение Mongodb для 200 миллионов документов

У меня есть коллекция MongoDB, содержащая около 200 миллионов записей для разных веб-сайтов. Документы имеют следующую структуру:

{
  "_id": {
    "$oid": "6647314adcfdad8dd8b1c84f"
  },
  "url": "http://example.com/login.php",
  "name": "Jack"
}

У меня есть как обычный индекс, так и текстовый индекс в поле URL. Когда я пытаюсь найти субдомены для определенного домена, запрос почти никогда не завершается:

{
  "url": {
    $regex: "^http://([a-zA-Z0-9-]+\\.)*google\\.com"
  }
}

Функция объяснения указывает, что мой индекс используется. Я также попытался упростить регулярное выражение для поиска простого шаблона http или https, но это также не улучшило производительность.

Единственный быстрый поиск — это точный поиск по домену:

{
  "url": {
    $regex: "^https://example.com"
  }
}

Я запускаю его на Intel i5-12450H и 32 ГБ оперативной памяти.

Что я делаю не так? Или MongoDB не предназначен для такого рода задач?

Вы ожидаете чего-то еще, кроме http или https? Я бы просто попробовал текстовый поиск { $text: { $search: 'google.com' }}, а затем второй фильтр с регулярным выражением. Регулярное выражение, как правило, является медленной операцией.

Wernfried Domscheit 18.05.2024 19:52
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
0
2
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Решение: Просто создайте отдельное поле для домена. Я извлекаю его, используя tldextract Python. Так гораздо быстрее.

Другие вопросы по теме