Я буквально исследовал всю сеть и не смог найти удовлетворительного ответа на этот вопрос, поэтому подумал, что я спрошу здесь.
По сути, я пытаюсь создать полнотекстовый поисковый запрос с разбиением на страницы, который возвращает результаты, отсортированные по времени.
Проблема в том, что наивная сортировка, подобная следующей, вообще не выполняется:
db.collection
.find({ $text: { $search: "hello" } })
.sort({ created_at: -1 })
.limit(100)
.toArray(function(....
И да, я, конечно, проиндексировал его created_at
. И, как вы можете видеть, он ограничен 100 предметами.
Насколько я понимаю, полнотекстовый индекс в MongoDB не позволяет вам сортировать по какому-либо произвольному атрибуту в коллекции ВСЕ, и единственный способ отсортировать его - добавить некоторый атрибут $meta
для его сортировки. основанный на некотором внутреннем механизме оценки.
Но это не работает для меня, и я действительно хочу отсортировать это по created_at
.
Может быть, я неправильно понимаю все это, но я отказываюсь верить, что никто не придумал решения для этого очень очевидного варианта использования. Я что-то пропустил? Кто-нибудь знает, как отсортировать большой текстовый результат поиска по атрибуту коллекции? На этом этапе я был бы признателен за ЛЮБОЙ блеск света, даже если это взлом.
[РЕДАКТИРОВАТЬ] Например, без ограничения и сортировки, ответ будет выглядеть примерно так:
[{
"msg": "hello world",
"created_at": 1000
}, {
"msg": "hello",
"created_at": 899
}, {
"msg": "hello hello",
"created_at": 1003
}, {
...
}]
Но я хочу ограничить его только 100, отсортированным по created_at
, ПОСЛЕ того, как поиск в базе данных произвел «привет». Меня не волнует релевантность, и я хочу отсортировать только по времени.
[{
"msg": "hello hello",
"created_at": 1003
}, {
"msg": "hello world",
"created_at": 1000
}, {
"msg": "hello",
"created_at": 899
}, {
...
}]
Просто чтобы прояснить, запрос работает, но он занимает очень много времени, хотя я проиндексировал его с created_at
. У меня нет этой проблемы, когда я выполняю аналогичный шаблон find-sort-limit с другими запросами (не полнотекстовым поиском), и я думаю, что это характерно для полнотекстового поиска.
Я ищу способ как-нибудь ускорить этот запрос.