Медленные запросы при текстовом поиске 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. Но что то мне подсказывает что выборка будет плюс минус такой же по времени, если не дольше.
Какие есть варианты для оптимизации? Или вовсе рассмотреть другую базу данных?