Mongodb полнотекстовый поиск с сортировкой по отметке времени? - PullRequest
0 голосов
/ 03 ноября 2018

Я буквально исследовал всю сеть и не смог найти удовлетворительного ответа на этот вопрос, поэтому подумал, что я спрошу здесь.

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

Проблема в том, что наивная сортировка, подобная следующей, вообще не выполняется:

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 с другими запросами (не полнотекстовым поиском), и я думаю, что это характерно для полнотекстового поиска.

Я ищу способ как-нибудь ускорить этот запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...