Проблемы памяти автозаполнения и текстового поиска в apostrophe-cms: нужны идеи - PullRequest
0 голосов
/ 24 февраля 2020

У меня проблемы с использованием текстового поиска и автозаполнения, потому что у меня есть кусок с документами + 87k, некоторые из них большие (~ 3,4 МБ текста).

Я уже:

  1. Удалены все поля из текстового индекса, кроме title, searchBoost и seoDescription; это единственные поля, скопированные в highSearchText, а поле lowSearchText всегда установлено в пустую строку.
  2. Изменен стандартный текстовый индекс, включая поля type, published и trash в начале этого. Я также изменил запросы, чтобы иметь условия равенства для этих полей. Результат, возвращаемый командой db.aposDocs.stats (), показывает: type_1_published_1_trash_1_highSearchText_text_lowSearchText_text_title_text_searchBoost_text: 12201984 (~11 MB, fits nicely in memory)
  3. Проверено, что этот индекс используется, как в запросе toDistinc, так и в окончательном запросе toArray.

Что, на мой взгляд, является самой большой проблемой

В документах много повторяющихся слов в заголовке, поэтому, если пользователь вводит слово, присутствующее в заголовках 5k документов, сервер страдает.

Идея, которую я тестирую

В документации MongoDB говорится, что для повышения производительности вся коллекция должна помещаться в ОЗУ (https://docs.mongodb.com/manual/core/index-text/#storage - требования и производительность - затраты , последний пул ).

Итак, я создал отдельную коллекцию с именем «search», содержащую только поля highSearchText (строка, проиндексированная как текст) и highSearchWords (массив, также проиндексированный), в результате чего общий размер составил ~ 19 МБ.

Выполняя те же операции стандартного автозаполнения апострофов в этой коллекции, я добился гораздо более быстрых, но схожих результатов.

Мне пришлось писать события для автоматического обновления Поиск в коллекции, когда фрагмент изменяется, но, кажется, он работает до сих пор.

Проблемы

Я тестирую эту коллекцию поиска с автозаполнением. Для простого текстового поиска я ограничиваю отсортированный ответ 50 результатами. Может быть, мне придется использовать коллекцию поиска, потому что поиск все еще может прерваться.

Есть ли какой-то более простой подход, который я пропускаю? Пожалуйста, любые идеи приветствуются.

...