Медленные запросы при текстовом поиске MongoDB

Никак не могу решить вопрос с медленными запросами при текстовом поиске. Коллекция Posts

{
  _id: ObjectId(""),
  public: Number,
  type: String,
  catalog: Schema.Types.ObjectId,
  subscribe: String text
}

Для Posts есть созданный индекс

schema.index({ subscribe: 'text', catalog: 1, type: 1, public: 1 }, { default_language: "russian" })

В коллекции Posts этих документов 400 000

Поле subscribe формируется из набора слов, от 5 до 20 слов, своего рода теги, небольшая строка со словами.

При запросах вида

const query = {
    "$text": {
        "$search": "текст слово второе слово третье"
    },
    catalog: { "$nin": [ObjectId("54369306d8f99e0f969710da")] },
    type: "post",
    public: {"$gte": 4}
}

Тратиться уйма времени в тех запросах где в выборке может находится от 50 000 записей, они жутко долгие.

Я понимаю что MongoDB перебирает каждое слово для поиска документов, но не понимаю почему так долго. Если документов с подобными словами к примеру 1000, то запрос выполняется довольно быстро, но вот если их порядка 50к, то от 2х секунд. При чем это без сортировки и прочего.

Как вы с подобными запросами боритесь?

Может быть мне стоит как то переделать структуру коллекции.

У меня так же были мысли сделать дополнительную коллекцию tags, в которой создавать документы по словам

{
    _id: ObjectId(""),
    tag: String
}

А затем в posts.tags размещать в массиве идентификаторы tags._id. Производить текстовый поиск по tags.tag, получать массив идентификаторов и производить уже выборку в posts.tags. Но что то мне подсказывает что выборка будет плюс минус такой же по времени, если не дольше.

Какие есть варианты для оптимизации? Или вовсе рассмотреть другую базу данных?


Ответы (0 шт):